C为包含多个char *的结构数组分配内存

时间:2012-12-14 13:12:58

标签: c memory-management

我有问题为包含char *的结构数组分配内存。

我有一个结构“人”

typedef struct
{
    char *name;
    char *surname;
    char *phonenumber;
} Person;

我想要做的是从文件中读取一些数据并填充我必须动态分配内存的人的数组( Person * array )。


目前,我有类似的东西:

array = malloc(sizeof(Person) * arraysize);
Person *buff;
char   text[100];
char   *result;

for(i=0; i<arraysize; i++)
{
    buff = &array[i];
    fgets(text, 100, f );

    //Read first name
    result = strtok(text,":");
    buff->name= malloc(strlen(result));
    buff->name= result;

    //Read surname
    result  = strtok(0,":");
    buff->surname = malloc(strlen(result));
    buff->surname = result;

    //Read phone number
    result = strtok(0, ":");
    buff->phonenumber = malloc(strlen(result));
    buff->phonenumber = result;
}

当我打印出整个数组时,我没有得到任何有效数据。我想知道我做错了什么。我提前为你的答案做好准备!

5 个答案:

答案 0 :(得分:2)

buff->name= result

重置指针buff->name以指向内存中与result相同的位置。如果要复制result的字符串内容,请使用strcpy

strcpy(buff->name, result);

但请注意,在调用malloc时,您必须为尾随的NUL字符预留空间:

buff->name = malloc(strlen(result) + 1);

如果您使用的是POSIX系统(Linux,Mac OS X,任何Unix),您可以使用更方便的{{1}替换mallocstrlenstrcpy }:

strdup

答案 1 :(得分:2)

问题是:

result = strtok(text,":");
buff->name= malloc(strlen(result));
buff->name= result;

您需要使用strcpy进行复制,并且malloced字符串的长度应该比字符串长度多一个,以容纳NUL字符。

buff->name= malloc(strlen(result) + 1);

答案 2 :(得分:2)

此:

buff->name= malloc(strlen(result));
buff->name= result;

坏了。您无法在C中分配“字符串”,您需要复制字符。 malloc()返回的指针被result覆盖,泄漏内存。此外,您需要为终结器包含空间。

所以,这应该是:

buff->name= malloc(strlen(result) + 1);
strcpy(buff->name, result);

答案 3 :(得分:2)

strtok每次都覆盖指针。因此,当迭代进行时,您将丢失指向数据的指针。

如果你想直接指定指针,你可以这样做:

  result = strtok(text,":");
  buff->name= strdup(result);

strdup 是POSIX功能。因此,如果它不可用,您可以轻松实现它。

答案 4 :(得分:1)

您需要将结果中的文本复制到新分配的内存块中。 现在你只需分配内存(将指针指定给指针),然后丢弃该指针并为其分配新的指针结果。 你需要将结果strncpy到新的内存分配。 strlen也不包括终止零字节,因此新内存块中没有足够的空间。 有一个函数strdup可以做你想要的。