通过引用传递结构并分配字符串

时间:2015-03-05 20:13:36

标签: c++ function pointers structure

这是一个简单的程序,我试图通过引用和字符串将结构传递给函数。该函数应该检测字符串的长度并为其分配结构的成员。这是程序:

#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的长度。

2 个答案:

答案 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