按值填充值 a char *

Fill value by value a char *

我正在尝试在 struct nodo;

中填充 char *info

这是结构:

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 != '[=11=]') {
    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 != '[=11=]' )
{        
    if (*k == ' ' )
    {
        head = head->succ; 
        i = 0;
    }
    head->info[i] = *k; // ERROR EXC BAD ACCESS 
    i++;
    k++;
}
return t;
}

k 是一个 char* 并且应该滚动分配给的 char[] 并且应该将他的任何值复制到 head->info[i] 中的适当位置 head->info[i] =13=] 在 struct

如果k命中space,则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;

编辑:抱歉缺少代码。

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

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

您可能需要用 info = malloc(size_i_want) 之类的东西来初始化 info,但很难看出您在此处尝试实现的目标。

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

根据您的输入有多大,您可以 char info[256](或任何您想要的大小)或者您可以 calloc 您想要的 space 数量 Createxxxx 函数。

此外,您实际上只需要一个 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 个函数可以 debug/fix。