按值填充值 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。
我正在尝试在 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。