我有问题为包含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;
}
当我打印出整个数组时,我没有得到任何有效数据。我想知道我做错了什么。我提前为你的答案做好准备!
答案 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}替换malloc
,strlen
和strcpy
}:
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可以做你想要的。