c - 在 C 中访问和修改字符串 (char*) 数组时出现段错误

标签 c arrays pointers segmentation-fault

我在一个程序上遇到了段错误(gdb 在回溯上打印“??”),我现在正在尝试编译一段时间,并且在尝试了很多事情之后(例如重新编程我使用的数据结构)现在应该可以工作了)尽管现在它给了我一行(我在此处添加了注释),但我仍然不断出现段错误。

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

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

我试图开始工作的代码,其中“char *** mains”参数从一个单独的函数“runner”中获取 &(char **),我想对其进行编辑,以便我可以查看“runner”中的内容:

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);
}

在所有情况下,不要忘记对从 mallocstrdup 收到的每个指针调用 free。如果程序在您调用 free 之后立即结束,您可以跳过这部分。

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

相关文章:

c - 是否可以将标签的地址存储在变量中并使用 goto 跳转到它?

iphone - 使用我自己的 typedef 枚举,得到 'Makes pointer from integer without cast'

c - 定时器实现超时功能

python - 如何将带有 char** argv 的 C 函数输入转换为 python?

java - 将 int 放入对象数组后,我得到的是 Integer 还是 int ?

c++ - 从指针转换为非标量对象类型?

c - 文件 CaesarShift 加密

c - 多线程->调度。核心转储

具有数组输入 : Error:|Cannot cast float to float*| without any cast 的自定义函数

sql - hive collect_set 数组操作