以下代码在注释行中以分段错误错误中止。该行旨在简单地替换一个字符。
#include <stdio.h>
#include <ctype.h>
int num(char zf[], int n) {
int i;
for (i = 0; i < n; i++) {
// assignment = seg fault
if (zf[i] == ',') zf[i] = '.';
if (!isdigit(zf[i]) && zf[i] != '+' && zf[i] != '-' && zf[i] != '.') {
return 0;
}
}
return 1;
}
int main(void) {
if (num("-3+3,0", 6)) {
printf("valid\n");
} else {
printf("not valid\n");
}
return 0;
}
我正在寻找一个解释为什么会出现错误以及解决方案是什么? strncpy()函数?函数num的参数和数据类型不得更改。
答案 0 :(得分:6)
字符串文字被编译到程序中,并作为字节数组存储在二进制文件中的某个位置。您可以在Linux中尝试strings
命令以查找二进制文件中的字符串文字。
字符串常量很可能存在于程序的只读部分中,这就是为什么它被修改为未定义的行为。当您尝试访问或修改不应访问或修改的内存部分时,会发生分段错误。
答案 1 :(得分:1)
虽然在C字符串文字中有非常量字符数组的类型,但C标准不允许更改它们。
4相同的考虑因素适用于a中序列的每个元素 字符串文字,就像它在整数字符常量
中一样
如果程序试图修改字符串文字,则其行为未定义。
您应该按以下方式定义main
int main(void) {
char s[] = "-3+3,0";
if (num(s, sizeof( s ) - 1 )) {
printf("valid\n");
} else {
printf("not valid\n");
}
return 0;
}
答案 2 :(得分:0)
此处if (num("-3+3,0", 6))
,&#34; -3 + 3,0&#34; 存储在只读内存中。因此修改它会导致分段错误。
使用数组使"-3+3,0"
存储在堆栈中。然后我们可以修改值。