这是一个简单的程序,我试图通过引用和字符串将结构传递给函数。该函数应该检测字符串的长度并为其分配结构的成员。这是程序:
#include <iostream>
#include <string.h>
struct stringy // structure definition
{
char *str;
int ct;
};
void set(stringy &beany, const char *testing); // function definition
int main()
{
stringy beany;
char testing[] = "Reality isn't what it used to be.";
set(beany, testing); // function call
return 0;
}
void set(stringy &beany, const char *testing) // function prototype
{
int i=0;
while (*(testing+i) != '\0') // this loop counts the number of characters
{
i++;
std::cout << i << "\n";
}
beany.str = new char[i]; // dynamic storage allocation
std::cout << strlen(beany.str); // printing the length of the string
}
由于某种原因,函数set()中最后一行的输出为47,而“i”的值为33.最后15个字节用垃圾值填充。我希望beany.str的长度应该等于* testing的长度。
答案 0 :(得分:1)
您为beany.str
分配内存但不初始化该内存。没有任何初始化的分配内存的内容是不确定(实际上看似随机)。
另外请不要忘记旧的C风格字符串需要由特殊的'\0'
字符终止(或strlen
之类的函数不起作用)。
这两个问题,使用未初始化的内存并忘记终结符,将导致undefined behavior。
答案 1 :(得分:1)
beany.str = new char[i]; // dynamic storage allocation std::cout << strlen(beany.str); // printing the length of the string
strlen
查找终止空字符'\0'
。 beany.str
中没有保证,因为您为其分配new char[i]
的结果,该结果不会对元素进行零初始化。它为{strong>未初始化为零的i
个字符分配空间。
即使它们是,strlen
也会返回0,因为它会立即在第一个位置找到'\0'
。如果你不以某种方式记住自己i
,那么尺码信息就会丢失。
查看以下程序的输出:
#include <iostream>
int main()
{
char *str = new char[100];
for (int i = 0; i < 100; ++i)
{
std::cout << str[i] << "\n";
}
}
行为未定义。你可能看到的是一些看似随机的角色。
如果您想要零初始化,请使用new char[i]()
。
但是,strlen
仍为0:
#include <iostream>
#include <string.h>
int main()
{
char *str = new char[100]();
for (int i = 0; i < 100; ++i)
{
std::cout << str[i] << "\n";
}
std::cout << strlen(str) << "\n";
}
你应该摆脱array-new和array-delete。使用std::string
。