我试图填写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;
}
k
是char*
,应滚动指定的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;
编辑:抱歉没有代码。
答案 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个函数可以调试/修复。