【问题标题】:Fill value by value a char *按值填充一个字符 *
【发布时间】:2015-05-29 20:07:26
【问题描述】:

我正在尝试在 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 != '\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 in struct

如果k 击中一个空格,则节点转到下一个节点,并且“i”再次变为 0,因为i 需要在每个节点中填写一个单词。

但此代码在标记行中显示错误 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;

编辑:抱歉缺少代码。

【问题讨论】:

  • 定义在哪里?
  • 请告诉我们struct head,虽然我猜head->info不是char **类型或定义为char * info[N]
  • 提供的相比,missing的代码可以准确地帮助解决这个问题。请生成一个包含所有相关部分的MCVE,以便我们重现您所看到的内容。
  • 显示struct,你如何声明info
  • 我猜你是意大利人,struct nodo 定义了某个链接树或链结构中的一个节点,但是搜索会引发许多不同的问题,例如 struct nodos:你真的_必须_ 告诉我们你的定义是什么。正如@WhozCraig 所说,我们需要proper code example (MVCE),然后我们可以为您提供帮助。

标签: c list pointers struct char


【解决方案1】:

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

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

您可能需要使用info = malloc(size_i_want) 之类的东西来初始化info,但在这里很难看出您想要实现什么。

【讨论】:

    【解决方案2】:

    您获得 EXC BAD ACCESS 的原因是因为您从未实际为 info 分配内存。在您的 struct nodo 中,您将 info 定义为指向字符的指针,但您永远不会为它分配任何内存。

    根据您的输入可能有多大,您可以使用char info[256](或您想要的任何大小),或者您可以callocCreatexxxx 函数中所需的空间量。

    另外,你真的只需要一个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 个函数可以调试/修复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-22
      相关资源
      最近更新 更多