当我尝试打印字符串的strlen(字符串数组的一部分)时,为什么会出现段错误?我可以打印每个字符串-printf可以完美地工作。但是为什么strlen会导致段错误?
下面的程序首先接受输入n,这是我要动态分配的字符串数。然后我为每个字符串分配32个字节的空间
int main() {
int i;
int n;
char **nums;
scanf("%d", &n);
printf("n = %d\n", n);
nums = malloc(sizeof(char *) * n);
printf("allocated nums\n");
for(i=0; i<n; i++) {
nums[i] = malloc(sizeof(char) * 32);
memset(nums[i], '\0', sizeof(char) * 32);
}
for(i=0; i < n; i++) {
scanf("%s", &nums[i]);
}
for(i=0; i<n; i++) {
// THIS PRINTS FINE
printf("string = %s\n", &nums[i]);
// SEGFAULT HERE IMMEDIATELY
printf("length = %d\n", strlen(nums[i]));
}
这是控制台输出。作为测试,我输入n = 3,然后输入数字45、46和47:
3
n = 3
allocated nums
45
46
47
string = 45
Segmentation fault (core dumped)
此外,当我尝试访问每个字符串中的单个字符时,我也会遇到段错误。同样,外部for循环中的第一个printf打印字符串,然后我得到一个访问nums [i] [k]的段错误:
int i, k=0;
for(i=0; i<n; i++) {
printf("Printiiing: %s\n", &nums[i]);
// WHY DOES THIS SEGFAULT???
//printf("first char = %c\n", nums[i][0]);
while(k<32 && nums[i][k] != '\0') {
// THIS CAUSES A SEG FAULT
printf("char = %c", (nums[i])[k]);
k++;
}
}
答案 0 :(得分:0)
这很好:
for(i=0; i<n; i++) {
nums[i] = malloc(sizeof(char) * 32);
memset(nums[i], '\0', sizeof(char) * 32);
}
此循环之后,每个nums[i]
都是一个指向32字节缓冲区的指针。
但这会破坏(覆盖)所有指针,而不是将字符串读入分配的缓冲区中:
for(i=0; i < n; i++) {
scanf("%s", &nums[i]);
}
要修复该错误,请使用:scanf("%s", nums[i]);
。
答案 1 :(得分:0)
&nums[i]
和nums[i]
地址之间有一个差异指针。您可以使用strlen((const char*)(&nums[i]))
检查长度。
@Employee of Russia的解释完全是出于原因。