我在一个程序上遇到了段错误(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);
}
在所有情况下,不要忘记对从 malloc
或 strdup
收到的每个指针调用 free
。如果程序在您调用 free
之后立即结束,您可以跳过这部分。
关于c - 在 C 中访问和修改字符串 (char*) 数组时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52960932/