在结构中使用指针

时间:2012-01-19 20:49:15

标签: c

当我输入“stuList [1] .name”时,发生了错误,程序崩溃了。我该如何解决这个问题?

#include <stdio.h>
#include <conio.h>

typedef struct student
    {
        int id;
        char *name;
        float percentage;
    } student;

int main()
{
    student stuList[3];
    stuList[0].name = "vermidonhapic"; 
    stuList[2].name = "didiervermiyer";

    scanf("%s\n",&stuList[1].name);

    printf(" name is: %s \n", stuList[0].name);
    printf(" name is: %s \n", stuList[2].name);  
    printf(" name is: %s \n", stuList[1].name);

    system("PAUSE");
}

4 个答案:

答案 0 :(得分:2)

stuList[1].name是一个无效指针,因为它尚未初始化为指向有效对象。

您应该为malloc动态分配内存(通过stuList[1].name函数),以便scanf可以写入已分配的对象。

stuList[1].name = malloc(size_enough_to_store_your_string);

此外,stuList[1].name是指向char的指针,因此您应该使用stuList[1].name而不是&stuList[1].name(指向char的指针){ {1}}函数调用。

答案 1 :(得分:2)

在此命令中:scanf("%s\n",&stuList[1].name);

您正在从输入中扫描字符串而不实际分配所需的内存。

这导致尝试将数据写入未知地址,这不是您的地址,这会导致分段错误。

要修复它,首先分配内存:stuList[1].name = malloc(MAX_LENGTH);,然后才能:从stdin扫描字符串。

答案 2 :(得分:2)

name只是一个指向你自己的内存的指针,因此通过它写入会损坏内存。您需要使用malloc()为其分配一些内存,或者将其设为数组而不是指针。

答案 3 :(得分:1)

您忘了为stuList[1].name分配内存。您需要使用malloc从堆中分配它或堆栈分配它。

stuList[1].name = malloc(MAX_NAME_LENGTH);//heap allocation
//use stuList[1].name
free(stuList[1].name);

char buffer[MAX_NAME_LENGTH];//stack allocation
stuList[1].name = buffer;

我省略了所有错误检查,防止过度运行缓冲区等。

由于stuList[1].name是指针,因此您在scanf中获取其地址时出错。