gpt4 book ai didi

c - 将指针传递给函数时出现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 05:58:18 24 4
gpt4 key购买 nike

当我在我的 while 循环中调用我的 getField(char *line, int field) 函数时出现段错误,我不确定为什么。我正在尝试将一行传递给函数和一个列号,以便我可以从 csv 文件的每一行中获取特定的列并将它们打印到屏幕上。感谢您的输入。

void getField(char *line, int field);

int main(int argc, char *argv[]) {

if(argc < 3) {
fprintf(stderr, "Too few arguments \"%s\".\n", argv[0]);
}

if(atoi(argv[1]) < 1) {
fprintf(stderr, "First argument must be >= 1 \"%s\".\n", argv[1]);
}
FILE *fp = fopen(argv[2], "r");
if(fp == NULL)
fprintf(stderr, "Cannot open file %s\n", argv[0]);
char buf[80];
while(fgets(buf, 80, fp) != NULL) {
getField(buf, atoi(argv[1]); // seg fault is happening here
}

return 0;
}

void getField(char *line, int field) {
printf("here2");
//char *ln = line;
int column = field - 1;
int idx = 0;
while(column) {
//printf("here");
if(line[idx] == ',') field--;
idx++;
}

for(int j = idx; ; ++j) {
if(line[j] == ',') break;
printf("%s", line[j]);
}
printf("\n");
printf("%d", idx);
}

最佳答案

一个明显的错误是你在这里有一个无限循环,你最终会访问非法内存。

while(column) {
//printf("here");
if(line[idx] == ',') field--;
idx++;
}

您根本没有修改 column,因此您的循环不可能结束。column 不会在您更新 field 时自行更新,因此如果您希望它更新,则必须更新它。

while(column) {
//printf("here");
if(line[idx] == ',') field--;
idx++;
column = field - 1;
}

关于使用 printf 调试段错误的注意事项。

函数 printf 打印到 stdout 并且 stdout 喜欢缓冲输出。这意味着有时如果您尝试通过将打印语句向下移动代码直到无法打印来查找段错误,您会误解它发生的位置。特别是,出现在实际包含段错误的行之前的 printf 行可能不会打印,即使您可能希望它打印。

如果你想使用这个策略(而不是 gdb),你可以在调试后立即使用 fflush(stdout); 强制它打印 printf.

关于c - 将指针传递给函数时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23100919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com