gpt4 book ai didi

c - 我是 C 新手,但收到 "Segmentation Faults"(段错误/SIGSEGV)。为什么?

转载 作者:行者123 更新时间:2023-11-30 20:48:23 24 4
gpt4 key购买 nike

当我尝试运行以下逻辑片段时,出现段错误,为什么?有时我没有得到段错误,而是得到了没有意义的奇怪输出......

1。更改字符串的字符

char *str       = "Hello!";
str[0] = 'h'; // SIGSEGV
<小时/>

2。修改指针的值

int *num_ptr;
*num_ptr = 6; // SIGSEGV
<小时/>

3。使用从函数返回的数组或指针

int *getPoint()
{
int cords[2] = {10, 20};
return cords;
}

/* ... */

int *point = getPoint();
int total = point[0] + point[1]; // SIGSEGV (or sometimes total = 0?)
<小时/>

4。在函数中循环遍历 n 大小的数组

void print_loop(int *array)
{
for(int i = 0; i < sizeof(array); i++)
printf("array[%d] = %d\n", i, array[i]); // SIGSEGV
}

/* ... */
int nums[3] = {1, 2, 3};
print_loop(nums);
<小时/>

我该如何解决这些问题并了解它们发生的原因?

最佳答案

char *str;
int *num_ptr;
int *point;

^^ 此代码只是创建一个变量供您使用,该变量是指向内存的指针。意识到它从不分配或保留内存。

因此,对于2,您执行*num_ptr = 6;,您试图将6的值放入num_ptr指向的内存中。但 num_ptr 还没有指向任何地方,它要么指向 NULL,要么未初始化并包含一些随机数值。如果它包含一些随机数值,则它可能不是有效的内存位置,因此会出现分段违规。如果它没有产生 SIGSEV 并且代码运行了,那么你很幸运;如果编程的基本概念是偶然发生的,您永远不会想以这种方式进行编程。

同样的原则适用于所有其他示例。数据类型并不重要。这是拥有指向内存的指针的基本问题,以及您是否(通过任何方式)保留或分配了一些有效范围的存储空间(RAM、磁盘,无论何处)。

str[0] = 'h';   is the same thing as            *str = 'h';
str[1] = 'h'; would be the equivalent of *(str+1) = 'h';
str[2] is *(str+2)
and so on,
where str is a pointer to the starting location of a range of memory,
then because str is of data type CHAR, +1 moves 1 byte, +2 moves 2 byte.
If it were of type INT where int is 4 bytes, then +1 would be the
initial memory location + 4.

关于c - 我是 C 新手,但收到 "Segmentation Faults"(段错误/SIGSEGV)。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41511436/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com