C 结构和指针

C structures and pointers

这是我的结构:

typedef struct Person {

    char* name;
    int age;
    float height;
    float weight;
    char** hobbies;

}person;

我尝试填写姓名,但没有用。

void main(){

    person Asaf;
    char buffer[50];
    int length;

    puts("Please enter the name of the student");
    gets(buffer);
    length = strlen(buffer);
    Asaf.name = realloc(buffer, length);

}

我就是想不通这个问题... 我想这与 realloc 函数有关。 请帮忙!! :P

您正在尝试重新分配(在堆上操作)分配在堆栈上的数组,这是一个禁忌。您想要的是:

Asaf.name = strdup(buffer);  /* POSIX: allocates a string copy of buffer on the heap */

或者,更标准地说:

Asaf.name = (char*) malloc(strlen(buffer) + 1);  /* TODO: should check allocations for NULL return */
strcpy(Asaf.name, buffer);

此外,您应该使用 fgets() 而不是 gets()。 gets() 本质上是危险的,永远不应使用,因为它不会对其写入的数组进行任何边界检查。

fgets(buffer, sizeof(buffer), stdin);

这个函数returns一个指向新分配内存的指针,如果请求失败则为NULL。

因此,当 realloc 在堆上运行时,将指向堆区域中内存分配的指针指向位于堆栈中的指针可能会导致一些问题,伙计。 所以也许未定义的行为可以是你得到的输出的答案。

关于如何使用realloc,所有的教学示例都包括这个- 使用重新分配:
1>检查是否是NULL.In这种情况使用perror并退出程序
2>如果不是NULL使用分配的内存
3>当你不再需要它时释放内存。

可能重复:How to use realloc in a function in C