1

我在为包含 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;
}

当我打印出整个数组时,我没有得到任何有效数据。我想知道我做错了什么。我提前感谢您的回答!

4

5 回答 5

2
buff->name= result

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

strcpy(buff->name, result);

但请注意,您还必须在调用中为尾随 NUL 字符保留空间malloc

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

如果您使用的是 POSIX 系统(Linux、Mac OS X、任何 Unix),您可以替换malloc,strlen并且strcpy更方便strdup

buff->name = strdup(result);
于 2012-12-14T13:14:33.207 回答
2

问题是:

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

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

buff->name= malloc(strlen(result) + 1);
于 2012-12-14T13:15:59.010 回答
2

这:

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

被打破。您不能像在 C 中那样分配“字符串”,您需要复制字符。返回的指针malloc()被 覆盖result,内存泄漏。此外,您需要为终结器留出空间。

所以,这应该是:

buff->name= malloc(strlen(result) + 1);
strcpy(buff->name, result);
于 2012-12-14T13:16:05.160 回答
2

strtok每次都覆盖指针。因此,随着迭代的进行,您会丢失指向数据的指针。

如果您希望直接分配指针,您可以执行以下操作:

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

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

于 2012-12-14T13:16:55.970 回答
1

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

于 2012-12-14T13:17:11.810 回答