我在 GCC 编译器中遇到分段错误
I'm getting a segmentation fault in GCC compiler
此函数出现分段错误:
#include <stdio.h>
#include <stdlib.h>
int heap [999],heap2 [999];
int* addDigit(int *arr, int SIZE, int D) {
int con=0;
for (int i = 0; i < SIZE; i++)
con = con * 10 + arr[i];
con += D;
int p = 0;
while (con >= 0) {
heap[p] = con % 10;
con /= 10;
p++;
}
for (int i = 0; i < p; i++)
printf("%d ", heap[i]);
heap2[0] = 11;
heap2[1] = -1;
int *pp = heap2;
return pp;
}
这是主要功能:
int main() {
int N, digit;
scanf("%d", &N);
int arr[N];
for (int index = 0; index < N; index++) {
scanf("%d", &arr[index]);
}
scanf("%d", &digit);
int *ptr = addDigit(arr, N, digit);
int index = 0;
while (*(ptr+index) !=-1) {
printf("%d", ptr[index]);
index++;
}
return 0;
}
为什么我在这里遇到分段错误?
该程序获取数组输入,如 [1 2 3]
和值 k
,比如 3;
它应该打印 1 2 6
.
我在这里使用了两个全局声明的数组。
通常,定位段错误源的最快方法是使用 -g
标志编译程序以在可执行文件中包含调试信息,然后使用 运行 程序Valgrind.
此时在读取heap
这里出现segmentation fault:
while (con >= 0)
{
heap[p] = con % 10;
con /= 10;
p++;
}
变量con
最终会变成0
,并且会停留在0
,因为重复除以10。它不会变为负数,因此 while 循环将无限重复。索引 p
将增加,直到程序尝试访问 heap
的元素 999 - 这是越界,即这是一个分段错误。
也许你打算写 while (con > 0)
?当 con
为零时(而不是像以前一样为负),这将停止循环。或者您可能需要不同的解决方案,具体取决于代码的预期功能。
PS。分段错误不会发生在“编译器中”,它会在程序执行时发生。
此函数出现分段错误:
#include <stdio.h>
#include <stdlib.h>
int heap [999],heap2 [999];
int* addDigit(int *arr, int SIZE, int D) {
int con=0;
for (int i = 0; i < SIZE; i++)
con = con * 10 + arr[i];
con += D;
int p = 0;
while (con >= 0) {
heap[p] = con % 10;
con /= 10;
p++;
}
for (int i = 0; i < p; i++)
printf("%d ", heap[i]);
heap2[0] = 11;
heap2[1] = -1;
int *pp = heap2;
return pp;
}
这是主要功能:
int main() {
int N, digit;
scanf("%d", &N);
int arr[N];
for (int index = 0; index < N; index++) {
scanf("%d", &arr[index]);
}
scanf("%d", &digit);
int *ptr = addDigit(arr, N, digit);
int index = 0;
while (*(ptr+index) !=-1) {
printf("%d", ptr[index]);
index++;
}
return 0;
}
为什么我在这里遇到分段错误?
该程序获取数组输入,如 [1 2 3]
和值 k
,比如 3;
它应该打印 1 2 6
.
我在这里使用了两个全局声明的数组。
通常,定位段错误源的最快方法是使用 -g
标志编译程序以在可执行文件中包含调试信息,然后使用 运行 程序Valgrind.
此时在读取heap
这里出现segmentation fault:
while (con >= 0)
{
heap[p] = con % 10;
con /= 10;
p++;
}
变量con
最终会变成0
,并且会停留在0
,因为重复除以10。它不会变为负数,因此 while 循环将无限重复。索引 p
将增加,直到程序尝试访问 heap
的元素 999 - 这是越界,即这是一个分段错误。
也许你打算写 while (con > 0)
?当 con
为零时(而不是像以前一样为负),这将停止循环。或者您可能需要不同的解决方案,具体取决于代码的预期功能。
PS。分段错误不会发生在“编译器中”,它会在程序执行时发生。