【问题标题】:trying to printf a char pointer from a struct but I get a segmentation fault in C试图从结构中打印一个 char 指针,但我在 C 中遇到分段错误
【发布时间】:2015-12-30 01:29:10
【问题描述】:

我正在使用结构做一些工作,由于某种原因,当我尝试运行我的程序时出现分段错误。如果我删除 printfunction 中的 printf 行,程序完成没有问题,但关键是打印出存储在 list->line 中的内容。

addLine 函数添加一个新的 struct-object,将其放在列表的末尾并指向第一个 struct-object。

printFunction 应该打印出列表中的所有行。

结构:

typedef struct listoflines list;

struct listoflines {
    list* next; 
    char* line;
};

addLine函数:

void addLine(list* firstline, char* linep) {
    list* newline = malloc(sizeof(list));
    newline->next = firstline;

    newline->line = malloc((sizeof(char) * strlen(linep) + 1));
    strcpy(newline->line, linep);

    list* currentline = firstline;

    while(currentline->next){
        if(currentline->next == firstline){
            currentline->next = newline;
            return;
        }
        else {
            currentline = currentline->next;
        }
    }
    currentline->next = newline;
}

printFunction函数:

void printFunction(list* firstline){
    list* currentline = firstline;

    while(currentline->next != firstline){
        printf("%s\n", currentline->line);
        currentline = currentline->next;
    }
}

addLine 函数已经运行了 4 次,并且 printFunction 被赋予了一个指向与 addline 函数相同的“第一行”的指针。 非常感谢任何帮助。在这一点上,我不知道可能出了什么问题。

【问题讨论】:

  • 你如何初始化firstline
  • 列出结构体; memset(&structholder, 0, sizeof(list));
  • 然后我发送地址(&structholder)
  • 好吧,看起来初始化确实导致了错误。详细回答如下。

标签: c struct segmentation-fault printf


【解决方案1】:

由于您使用全零初始化 firstline,因此在 while 循环的第一次迭代中,currentline->line 将为 NULL,并且在打印该行时会出现段错误。您可以使用gdb 轻松调试此类错误。

list* currentline = firstline;

while(currentline->next != firstline){
    printf("%s\n", currentline->line); /* the string here will be NULL */
    currentline = currentline->next;
}

关于您的实现的一个小建议:您可以使用这样的结构来使您的程序更具可读性:

struct text {
    list *firstline;
    list *lastline;
}

然后创建结构的一个实例并传递它而不是传递firstline。这样,文本中没有行会更加明显(firstline 将是NULL)。您还可以摆脱addLine() 中的while 循环,因为您已经维护了指向最后一行的指针。

此外,您可以使用string.h 中的strdup() 来创建字符串的新副本,而不是使用malloc()strcpy()

【讨论】:

  • 非常感谢!对于答案和建议
猜你喜欢
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
相关资源
最近更新 更多