按值填充值char *

时间:2015-05-29 20:07:26

标签: c list pointers struct char

我试图填写char *info

中的struct nodo;

这是结构:

struct nodo {
char *info;
struct nodo *prec;
struct nodo *succ;
};
typedef struct nodo nodo;

这是完整的功能:

nodo *q,*t = NULL,*head = NULL;
int i, nodi=0 ;
char *c = a, *k = a;

while ( *c != '\0') {
    if (*c == ' ')
        nodi++;
    c++;
}

for (i = 0; nodi != 0; i++) {
    if (i == 0){
        head = CreateFirstNodo();
        t = head;}
    if (i == 1)
        q = CreateSecondNodo(head);
    else
        q = CreateNNodo(head);
    nodi--;

}


char *k = a;
int i = 0;
while ( *k != '\0' )
{        
    if (*k == ' ' )
    {
        head = head->succ; 
        i = 0;
    }
    head->info[i] = *k; // ERROR EXC BAD ACCESS 
    i++;
    k++;
}
return t;
}

kchar*,应滚动指定的char[],并将其任何值复制到head->info[i] char *info中的适当位置在struct

如果k遇到一个空格,那么nodo会转到下一个nodo,并且“#i}再次变为0,因为i需要在每个nodo中填充一个单词。

但是此代码在标记的行中显示错误EXC BAD ACCESS。

以下是3个CreateNodo函数:

nodo *CreateFirstNodo() {
nodo *q;

q = malloc(sizeof(nodo));
q->prec = NULL;
q->succ = NULL;

return q;
}

nodo *CreateSecondNodo(nodo *head) {
nodo *q;

q = malloc(sizeof(nodo));
q->succ = NULL;
q->prec = head;
head->succ = q;

return q;
}


nodo *CreateNNodo(nodo *head) {

nodo *q;

while (head->succ != NULL) {
    head = head ->succ;
}

q = malloc(sizeof(nodo));
q->succ = NULL;
q->prec = head;
head->succ = q;

return q;
编辑:抱歉没有代码。

2 个答案:

答案 0 :(得分:3)

您可能尝试取消引用未初始化的指针(可能未显示初始化)。

当您访问info[i]时,它会添加info + i并将其用作地址以查找char。如果info具有无效值(例如NULL),则会出现您看到的错误。

您可能需要使用info之类的内容初始化info = malloc(size_i_want),但很难看到您在此尝试实现的目标。

答案 1 :(得分:1)

您获得EXC BAD ACCESS的原因是因为您实际上从未为info分配内存。在struct nodo中,info已定义为指向某个字符的指针,但您从未为其分配任何内存。

根据您输入的大小,您可以char info[256](或任何您想要的大小),也可以calloc Createxxxx函数中所需的空间量。< / p>

此外,您实际上只需要一个Create功能。我会做这样的事情:

nodo *CreateNodo(nodo *head)
{
    nodo *q;

    q = calloc(1, sizeof(nodo));
    if (q) {
        //assume info should be 256 chars
        q->info = calloc(256, sizeof(char));
        if (!q->info) {
            free(q);
            return NULL;
        }
        q->succ = NULL;
        q->prec = NULL;

        if (head) {
            while (head->succ != NULL) {
                head = head->succ;
            }
            q->prec = head;
            head->succ = q;
        }

    return (q);
}

这样你只有1个函数可以调试/修复。