在C语言中向变量添加值时出现分段错误(内核转储) #包括 int main(){ 内勒巴,朱姆拉,i; 国际西斯瓦[列巴]; int x; printf(“这是一个很好的例子”); scanf(“%d”和“lebar”); 对于(i=0;i

在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

首先,欢迎使用Stack Overflow。因为它是一个国际社区,如果您的代码是用英语编写的,我们将不胜感激。例如,我可能知道您正在尝试做什么,但对于这样命名的变量,很难理解

第二,让我们看一下你的代码。我假设你在尝试一个用户输入的长度为<代码> 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)