所以我在C中工作,我在一个函数内部有一个int **
,它在另一个函数中被修改。 当我运行这个问题时,我得到了一个SegFault,所以我决定用gdb
调试它。 我发现内存从未分配给这个数组。 我的function是这样的
void declarer() { int ** a; alocator(a, 4, 5); for (int i = 0; i < 4; i++) for (int j = 0; j < 5; j++) printf("%dn", a[i][j]); } void alocator(int ** a, int b, int c) { a = (int **)malloc(sizeof(int *) * b); for (int i = 0; i < b; i++) { a[i] = (int *)malloc(sizeof(int) * c); for (int j = 0; j < c; j++) a[i][j] = j; } }
当我在行alocator(a, 4, 5)
之后运行带有断点的gdb
(在程序段错误之前),并且我写了pa
,我得到$1 = (int **) 0x0
,这表明a
是在地址0x0
并且有没有为它分配内存。 为什么alocator
没有为它分配内存,我怎样才能让alocator
为内存分配内存?
因为你传递**a
值,你必须将它作为指针传递。 所以使用三指针:
void declarer() { int **a; alocator(&a, 4, 5); ... } void alocator(int ***a, int b, int c) { *a = (int **)malloc(sizeof(int *) * b); ...
您将变量a
按值传递给函数,因此不会更改其值。 你有两个解决方案:
更改函数以接受int ***
类型的值并传递by地址,或将函数的返回值更改为int **
并在调用时使用该值。
例:
void declarer() { int ** a = alocator(4, 5); for (int i = 0; i < 4; i++) for (int j = 0; j < 5; j++) printf("%dn", a[i][j]); } int **alocator(int b, int c) { int **a = (int **)malloc(sizeof(int *) * b); for (int i = 0; i < b; i++) { a[i] = (int *)malloc(sizeof(int) * c); for (int j = 0; j < c; j++) a[i][j] = j; } return a; }
以上就是c/c++开发分享双指针在函数中没有得到malloc’d相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/519708.html