我一直在尝试编译一段时间的程序上尝试段程序后遇到分段错误(gdb在回溯上打印“ ??”),并尝试了很多方法(例如重新编程我使用的数据结构,现在应该可以使用) )尽管现在它给了我一行(我在此处添加了评论),但我仍然不断遇到段错误。

多次运行getMains()来标记同一文件中的不同行。

我希望mains是一个大小为4的数组,但是当将其作为“ char * mains [4]”传递时,II尝试将其传递给一个数组(*)[4]时遇到了编译错误,而我从未处理过(刚开始使用C)。我假设如果尝试访问未使用的任何部分,可能会出现问题,但是问题是在初始化数组的索引时发生的。

我正在尝试使用的代码,其中“ char *** mains”参数从单独的函数“ runner”中获取&(char **),我希望对其进行编辑,以便于查看“跑步者”中的内容:

bool getMains(FILE * file, char *** mains)
{
    char line[256];
    int start = 0;
    char * token;
    const char * mainDelim = "\t \n\0", * commDelim = "\n\t\0";

    if(fgets(line, sizeof(line), file) == NULL)
        return false;

    while(line[0] == '.')
        if(fgets(line, sizeof(line), file) == NULL);
            return false;

    if(line[0] == '\t' || line[0] == ' ')
    {
        (*mains)[0] = " ";
        start = 1;
    }

    token = strtok(line, mainDelim);
    int i;
    for(i = start; token != NULL; ++i)
    {
        (*mains)[i] = strdup(token); // <- gdb: Segmentation Fault occurs here

        if(i % 3 == 2)
            token = strtok(NULL, commDelim);
        else
            token = strtok(NULL, mainDelim);
     }

     free(token); // Unsure if this was necessary but added in case.
     return true;
}


/* Snippet of code running it... */
void runner(FILE * file) {
    char ** mains;
    if(!getMains(*file, &mains))
        return;
    while(strcmp(mains[1], "END") != 0){
        /* do stuff lookinig through indices 0, 1, 2, & 3 */
        if(!getMains(*file, &mains))
            break;
    }
}


关于此的任何提示还是通过其他功能通常可以安全地修改数组?

我应该将getMains()更改为“ getMains(FILE * file,char ** mains [4]);”并通过一个&“ char * mains [4]”)使其成为所需的设置大小?还是会产生错误?

最佳答案

您需要为市电分配内存,它应如下所示:

char ** mains;
mains = malloc(some number N * sizeof(char*));


如果不使用strdup,则需要这样的东西,它会为您分配内存:

for (int i = 0; i < N; ++i) {
  mains[i] = malloc(some number K);
}


在所有情况下,请不要忘记在从freemalloc收到的每个指针上调用strdup。如果程序在调用free之后立即结束,则可以跳过此部分。

关于c - 在C中访问和修改字符串(char *)数组时出现段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52960932/

10-15 02:11