具有结构-segmentation fault的程序出错

时间:2014-01-08 13:46:00

标签: c

    #include <stdio.h>

    struct p

    {
        char *name;
        struct p *next;
    };

    struct p *ptrary[10];

    int main()
    {
        struct p p, q;
        p.name = "xyz";
        p.next = NULL;
        ptrary[0] = &p;
        strcpy(q.name, p.name);
        ptrary[1] = &q;
        printf("%s\n", ptrary[1]->name);
        return 0;
    }

该程序在执行时给出了分段错误。 这有什么不对?我是否需要为ptrary分配内存?

4 个答案:

答案 0 :(得分:1)

在使用之前你必须分配一些内存。

q.name = malloc(10);
strcpy(q.name, p.name);

编辑:正确地通过展开指出,sizeof char将始终为1.因此从malloc移除。

答案 1 :(得分:1)

在使用strcpy()之前,您需要为字符串分配空间。您正在尝试将新字符串复制到内存中,该内存中包含从字符串文字初始化的字符串,这完全无效。这些字符串应该被认为是只读的。

您可以通过复制指针来避免此问题,然后指针将复制由字符串文字创建的字符串:

q.name = p.name;

答案 2 :(得分:0)

struct p
{
    char *name;  //name points nowhere
    struct p *next;
};

strcpy(q.name, p.name); // q.name is any arbitrary value

在使用前为name分配内存。

或声明为:

struct p
{
    char name[4];  //the number of characters you require
    struct p *next;
};

答案 3 :(得分:0)

#include <stdio.h>

    struct p

    {
        char name[10];
        struct p *next;
    };

    struct p *ptrary[10];

    int main()
    {
        struct p p, q;
        strcpy(p.name , "xyz");
        p.next = NULL;
        ptrary[0] = &p;
        strcpy(q.name, p.name);
        ptrary[1] = &q;
        printf("%s\n", ptrary[1]->name);
        return 0;
    }

或者您可以使用p.name = malloc(sizeof(char)*10);