是什么导致了这个小小的c程序中的分段错误?
我正在编写一个小c程序来练习是什么导致了这个小小的c程序中的分段错误?,c,C,我正在编写一个小c程序来练习malloc和sscanf库函数。但不幸的是,我得到了一个分段错误。我在谷歌上搜索了好几个小时,但没有结果。有人能带我离开这吗 #include <stdio.h> #include <stdlib.h> void print_array(int a[], int num_elements); int main(void) { int m; printf("How many numbers do you count:
malloc
和sscanf
库函数。但不幸的是,我得到了一个分段错误。我在谷歌上搜索了好几个小时,但没有结果。有人能带我离开这吗
#include <stdio.h>
#include <stdlib.h>
void print_array(int a[], int num_elements);
int main(void) {
int m;
printf("How many numbers do you count: \n");
scanf("%d", &m);
int *a = (int*)malloc(m * sizeof(int*));
char buf[100];
setbuf(stdin, NULL);
if (fgets(buf, sizeof buf, stdin) != NULL) {
char *p = buf;
int n, index;
while (sscanf(p, "%d %n", &a[index], &n) == 1 && index < m) {
// do something with array[i]
index++; // Increment after success @BLUEPIXY
p += n;
}
if (*p != '\0')
printf("you are giving non-numbers, will be ignored");
}
print_array(a, m);
free(a);
return 0;
}
void print_array(int a[], int num_elements) {
int i;
for (i = 0; i < num_elements; i++) {
printf("%d ", a[i]);
}
}
#包括
#包括
无效打印数组(int a[],int num_元素);
内部主(空){
int m;
printf(“你数了多少个数字:\n”);
scanf(“%d”、&m);
int*a=(int*)malloc(m*sizeof(int*);
char-buf[100];
setbuf(标准输入,空);
如果(fgets(buf,sizeof buf,stdin)!=NULL){
char*p=buf;
int n,索引;
而(sscanf(p,%d%n,&a[指数],&n)=1&指数
大多数[潜在]错误原因似乎来自未初始化自动变量:
scanf("%d",&m);
如果失败,则m
有一个未定义的值,因为您没有初始化它
在sscanf
中,您使用&a[index]
,但index
尚未初始化,因此可以在任何地方写入
另请参见注释,该注释识别了更多EROR(例如,检查
sscanf
)的返回值。您的malloc
存在故障。替换int*a=(int*)malloc(m*sizeof(int*)代码>带有int*a=(int*)malloc(m*sizeof(int))代码>。
幸运的是,sizeof
int
比int*
小,否则你会遇到一大堆问题
我无法重现错误,最好下次输入文本,但要调试segfault,我依赖于gdb
$gcc-g程序c-o程序
$gdb prog
gdb>运行[args]
这将在导致segfault的第行中断程序。使用本教程了解更多知识 您的程序有多个错误:
- 您不检查
scanf()
的返回值。无效输入将导致m
保持未初始化状态,分配m*sizeof(int)
可能会失败
- 为
malloc
计算的大小不正确。在C中,强制转换malloc()的返回值是不必要的,被认为是错误的样式。此外,您应该检查分配失败。改用这个:
int *a = malloc(m * sizeof(int));
sscanf(p,%d%n,&a[index],&n)
中的index
未初始化。
当您告诉sscanf()
将int
值存储到内存中的某个随机地址时,肯定会导致未定义的行为
在存储到&a[index]
后测试索引
,可能会导致缓冲区溢出。在sscanf()前面交换测试
以下是修改后的版本:
#include <stdio.h>
#include <stdlib.h>
void print_array(const int a[], int num_elements);
int main(void) {
int m;
printf("How many numbers do you count:\n");
if (scanf("%d", &m) != 1 || m <= 0) {
fprintf(stderr, "invalid input\n");
return 1;
}
int *a = malloc(m * sizeof(int));
if (a == NULL) {
fprintf(stderr, "memory allocation failed\n");
return 1;
}
char buf[100];
setbuf(stdin, NULL); // why do you want stdin to be unbuffered?
if (fgets(buf, sizeof buf, stdin) != NULL) {
char *p = buf;
int n, index = 0;
while (index < m && sscanf(p, "%d %n", &a[index], &n) == 1) {
// do something with array[i]
index++; // Increment after success @BLUEPIXY
p += n;
}
if (*p != '\0') {
printf("you are giving non-numbers or extra input, will be ignored\n");
}
}
print_array(a, m);
free(a);
return 0;
}
void print_array(const int a[], int num_elements) {
for (int i = 0; i < num_elements; i++) {
printf("%d ", a[i]);
}
printf("\n");
}
#包括
#包括
无效打印数组(常量int a[],int num_元素);
内部主(空){
int m;
printf(“你数了多少个数字:\n”);
如果(scanf(“%d”,&m)!=1 | mint*a=(int*)malloc(m*sizeof(int*);
您正在为m
指针的大小分配一个数组,而不是m
int
s.int-n,index;
int-n,index=0;
ANF(p),%d%n&&ssca[index],&n==1&code>,%d%n,&a[index],&n)==1
开始使用gdb。结束horrosint n,index;而(sscanf(p,%d%n,&a[index],&n)==1&&index
您在&a[index]中存储了一些内容,而索引未初始化。