我正在try 动态创建一个2D数组(5行和2个数组).在分配内存时,没有出现任何问题.但是,在将实际值分配给数组时,我收到了一个分段错误错误. 在调试过程中,我意识到当for循环中的i值为4时,错误弹出

即使在没有问题地分配了数组将使用的内存之后,如何可能出现分段故障错误?

 #include <stdio.h>
 #include <stdlib.h>
 
 int main(int argc, char *argv[]){
     int **ptr = (int **)malloc(sizeof(int)*5);
     for(int i = 0; i<5; i++){
         ptr[i] = (int *)malloc(sizeof(int)*2);
     }
     
     for(int i = 0; i<5; i++){
         for(int j = 0; j<2; j++){
             ptr[i][j] = i;
         }
     }
     return 0;
 } 

推荐答案

即使在没有问题地分配了数组将使用的内存之后,如何可能出现分段故障错误?

代码分配不正确.在OP的代码中,sizeof(int)*5是错误的大小.

  • 避免分配错误.引用对象的大小,而不是类型.它更容易在第一次编写正确的代码、审查和维护.在OP的例子中,sizeof ptr[0]是正确的大小,即指针的大小.sizeof(int)是不正确的,因为它是int的大小,但这里需要指针的大小.

  • 不需要铸造.

  • 更好地判断分配失败的代码.

    // int **ptr = (int **)malloc(sizeof(int)*5);
    int **ptr = malloc(sizeof ptr[0] * 5);
    if (ptr == NULL) Handle_OutOfMemory();

C++相关问答推荐

librsvg rsvg_handle_get_dimensions获取像素大小与浏览器中的渲染大小没有不同

为什么在C中设置文件的位置并写入文件,填充空字符?

ATmega328P EEPROM未写入

struct 上的OpenMP缩减

使用双指针动态分配和初始化2D数组

为静态库做准备中的奇怪行为

C-使用指针返回修改后的整数数组

如何有效地编写代码来判断两个元素数量相同的数组即使在不同的位置也具有相同的元素?

为什么此共享库没有预期的依赖项?

为什么函数是按照定义的顺序执行的,而不是按照从avr-c中的int main()调用的顺序执行的?

如何读取文件并将内容保存在字符串中?(在C语言中,没有崩溃或核心转储错误)

如何在VS 2022中正确安装额外的C头文件

添加函数会 destruct 嵌入式C代码(无IDE)

MacOS下C++的无阻塞键盘阅读

Caesar密码调试:输出文本末尾的问号和随机字符

RISC-V GCC编译器错误编译ASM代码

如何正确探测平台设备?

在 C/C++ 中原子按位与字节的最佳方法?

C23 中是否有 __attribute__((nonnull)) 的等效项?

为什么这里的符号没有解析?