在C语言中向变量添加值时出现分段错误(内核转储) #包括 int main(){ 内勒巴,朱姆拉,i; 国际西斯瓦[列巴]; int x; printf(“这是一个很好的例子”); scanf(“%d”和“lebar”); 对于(i=0;i
首先,欢迎使用Stack Overflow。因为它是一个国际社区,如果您的代码是用英语编写的,我们将不胜感激。例如,我可能知道您正在尝试做什么,但对于这样命名的变量,很难理解在C语言中向变量添加值时出现分段错误(内核转储) #包括 int main(){ 内勒巴,朱姆拉,i; 国际西斯瓦[列巴]; int x; printf(“这是一个很好的例子”); scanf(“%d”和“lebar”); 对于(i=0;i,c,C,首先,欢迎使用Stack Overflow。因为它是一个国际社区,如果您的代码是用英语编写的,我们将不胜感激。例如,我可能知道您正在尝试做什么,但对于这样命名的变量,很难理解 第二,让我们看一下你的代码。我假设你在尝试一个用户输入的长度为 LeBar < /C>的数组。在你的代码的第五行中定义了一个大小数组:代码> Labar < /Cord>。但是什么是代码? 因此,您有两种选择来解决此问题: 1) 在创建大小为lebar的数组之前,声明lebar并为其赋值 #include <stdi
第二,让我们看一下你的代码。我假设你在尝试一个用户输入的长度为<代码> LeBar < /C>的数组。在你的代码的第五行中定义了一个大小数组:代码> Labar < /Cord>。但是什么是代码? 因此,您有两种选择来解决此问题:
1) 在创建大小为lebar
的数组之前,声明lebar
并为其赋值
#include <stdio.h>
int main(){
int lebar,jumlah,i;
int siswa[lebar];
int x;
printf("Berapa Jumlah Siswa dalam Satu Kelas: ");
scanf("%d",&lebar);
for(i=0;i<lebar;i++){
printf("Masukan Nilai siswa ke-%d: ",i+1);
scanf("%d",&siswa[i]);
jumlah=jumlah+siswa[i];
}
//When I add value to this variable, it starts error
x=20;
printf("Jumlah Nilai total dari %d siswa adalah %d\n",lebar,jumlah);
return 0;
}
2) 动态分配大小为lebar
的数组(您可能需要使用#include
)
数组问题已经解决。但是看看代码,可以看到另一个问题:jumlah
的初始值是多少?因为我假设您正在根据代码的第14行对所有输入值进行求和,所以我建议您在for
循环的外部初始化jumlah
,值为0。在哪里,那由你决定。它可以在它的声明上
int main(){
int lebar; //again, I'd call it size...
int *siswa;
printf("Size: ");
scanf("%d",&lebar);
siswa = malloc(lebar * sizeof(int));
/* rest of your code ... */
}
或者循环之外的某个地方,例如循环之前:
int jumlah = 0;
intmain()
{
英特朱姆拉;
/*剩下的代码*/
朱姆拉=0;
对于(i=0;i而言,segfault实际上在这里
int main()
{
int jumlah;
/* rest of your code ... */
jumlah = 0;
for(i = 0; i<lebar; i++){
/* rest of your code ... */
}
}
问题就出在这里
scanf("%d",&siswa[i]);
lebar
此时未初始化。C中未初始化的变量可以包含任何内容。这意味着siswa
可以是任何大小
用于初始化siswa
的lebar
的垃圾值随后被scanf(“%d”,&lebar);
覆盖。循环假定siswa
与lebar
的新值一样长,但siswa
可以是任何大小。siswa[i]
可能未分配。如果是这样,当您尝试使用它时,将出现SEGFULT
简单的解决方案是在初始化lebar
后为siswa
分配内存
int siswa[lebar];
当运行并崩溃时,-fsanize=address
将为您提供堆栈跟踪
test.c:7:11: warning: variable 'lebar' is uninitialized when used here [-Wuninitialized]
int siswa[lebar];
^~~~~
test.c:6:10: note: initialize the variable 'lebar' to silence this warning
int lebar,jumlah,i;
^
= 0
1 warning generated.
这不是最容易阅读的内容,但它表明问题在于调用scanf
时。不要忽略scanf()
int main()
的返回值实际上不是main的正确签名,可能int main(void)
。最后,当你声明数组时,你能告诉我lebar
的值是多少吗?int-siswa[lebar];
?如果你不能,那是因为它的值还没有定义。@IharobAlAsimi:int-main(void)
是首选的,我认为int-main()严格来说,
有未定义的行为,但实际上它不会导致任何问题。(是的,修复它,但不要浪费时间寻找由int main()
引起的症状)@KeithThompson是的,当然,我不是说这是任何问题的原因。事实上,它后面的注释解决了实际的直接问题,正如您所知。定义长度为0的可变长度数组具有未定义的行为——这意味着编译器不必诊断错误。lebar
也可能有非常严重的错误rge正值或负值,两者都可能导致类似症状。
#include <stdlib.h>
...
int lebar,jumlah,i;
int *siswa;
printf("Berapa Jumlah Siswa dalam Satu Kelas: ");
scanf("%d",&lebar);
siswa = malloc( lebar * sizeof(int) );
test.c:7:11: warning: variable 'lebar' is uninitialized when used here [-Wuninitialized]
int siswa[lebar];
^~~~~
test.c:6:10: note: initialize the variable 'lebar' to silence this warning
int lebar,jumlah,i;
^
= 0
1 warning generated.
==16611==ERROR: AddressSanitizer: dynamic-stack-buffer-overflow on address 0x7ffee60c22a0 at pc 0x000109ed40c3 bp 0x7ffee60c2160 sp 0x7ffee60c1920
WRITE of size 4 at 0x7ffee60c22a0 thread T0
#0 0x109ed40c2 in scanf_common(void*, int, bool, char const*, __va_list_tag*) (libclang_rt.asan_osx_dynamic.dylib+0x1a0c2)
#1 0x109ed435e in wrap_scanf (libclang_rt.asan_osx_dynamic.dylib+0x1a35e)
#2 0x109b3eb0e in main (/Users/schwern/tmp/./test+0x100001b0e)
#3 0x7fff67e07114 in start (/usr/lib/system/libdyld.dylib+0x1114)