我必须询问我从这段代码中得到的中止(核心转储)错误
I have to ask about aborted(core dumped) error i get from this code
我在执行这段代码时遇到段错误。它打印 5 个数字中最大的一个,这些数字存储在堆内存中。
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = (int *)malloc(5 * sizeof(int));
*ptr = 5;
*(ptr + 1) = 7;
*(ptr + 2) = 2;
*(ptr + 3) = 9;
*(ptr + 4) = 8;
int *ptr_max = (int *)malloc(sizeof(int));
*ptr_max = 0;
for (int i = 0; i < 5; i++) {
if (*ptr_max < *ptr) {
*ptr_max = *ptr;
ptr++;
} else
ptr++;
}
printf("%d\n", *ptr_max);
free(ptr);
free(ptr_max);
return 0;
}
我想知道为什么我从上面的代码中得到这个错误。谁能给我解释一下吗?
真正的问题出在你 free()
-ing ptr
的时候。有一次,您增加一个指针,它的地址跳转到由 malloc()
分配的下一个地址。始终确保 *ptr
与 ptr[0]
相同。因此,要解决此问题,您可以将 ptr
减 5,或创建一个复制的指针。
给free()
的地址示例,它们不指向同一个内存块:
Before decrementing 0x213f2b4
After decrementing 0x213f2a0
减5
的原因是这两个十六进制值之差20
,同sizeof(int) * 5
.
ptr -= 5;
或
您可以创建指针的副本,然后对复制的指针执行操作:
int *my_copied_ptr = ptr; // you don't need to free this pointer
然后,free()
他们:
free(ptr);
free(ptr_max);
现在,要在大型代码库中进一步避免这些错误,请尝试使用 []
运算符,如下所示:
ptr[0] = 5;
ptr[1] = 7;
ptr[2] = 2;
ptr[3] = 9;
ptr[4] = 8;
我在执行这段代码时遇到段错误。它打印 5 个数字中最大的一个,这些数字存储在堆内存中。
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = (int *)malloc(5 * sizeof(int));
*ptr = 5;
*(ptr + 1) = 7;
*(ptr + 2) = 2;
*(ptr + 3) = 9;
*(ptr + 4) = 8;
int *ptr_max = (int *)malloc(sizeof(int));
*ptr_max = 0;
for (int i = 0; i < 5; i++) {
if (*ptr_max < *ptr) {
*ptr_max = *ptr;
ptr++;
} else
ptr++;
}
printf("%d\n", *ptr_max);
free(ptr);
free(ptr_max);
return 0;
}
我想知道为什么我从上面的代码中得到这个错误。谁能给我解释一下吗?
真正的问题出在你 free()
-ing ptr
的时候。有一次,您增加一个指针,它的地址跳转到由 malloc()
分配的下一个地址。始终确保 *ptr
与 ptr[0]
相同。因此,要解决此问题,您可以将 ptr
减 5,或创建一个复制的指针。
给free()
的地址示例,它们不指向同一个内存块:
Before decrementing 0x213f2b4
After decrementing 0x213f2a0
减5
的原因是这两个十六进制值之差20
,同sizeof(int) * 5
.
ptr -= 5;
或
您可以创建指针的副本,然后对复制的指针执行操作:
int *my_copied_ptr = ptr; // you don't need to free this pointer
然后,free()
他们:
free(ptr);
free(ptr_max);
现在,要在大型代码库中进一步避免这些错误,请尝试使用 []
运算符,如下所示:
ptr[0] = 5;
ptr[1] = 7;
ptr[2] = 2;
ptr[3] = 9;
ptr[4] = 8;