c - 动态分配二维数组时出现段错误

标签 c arrays

我很确定那些知道如何使用指针的人会对我生气,因为这似乎是一个已经回答的问题,但我无法理解我在这个三重指针上做错了什么......所以我是提前道歉......

我正在尝试通过此函数动态分配二维数组:

#include <stdio.h>
#include <stdlib.h>

float **alloctab(int dim1, int dim2) {
    float **ptr;

    ptr = malloc(dim1*sizeof(float *));
    if (ptr != NULL) {
    int i, taille_ligne = dim2*sizeof(float);
    float *tmp = malloc(dim1*taille_ligne);
    if (tmp != NULL) {
        for (i=0; i<dim1; i++) {
        ptr[i] = tmp;
        tmp += dim2;
        }
    }
    else
    ptr = NULL;
    }
    return(ptr);
}

int call_alloc(float ***ptr, int d1,int d2)
{
    int i,j;
    *ptr = alloctab(d1,d2);

    for (i=0;i<d1;i++)
    for (j=0;j<d2;j++)
        {
        *ptr[i][j]=(float)i+(float)j;
        printf("ptr[%d][%d]=%f\n",i,j,*ptr[i][j]);
        }
    return 0;
} 

int main() 
{
    float ***tab = NULL;
    int d1=6,d2=8;
    call_alloc(tab,d1,d2);
    return 0;
}

当然,我在使用它时遇到了段错误,尽管 -Wall 模式下的编译器不会提示任何事情......

感谢您的帮助!!

最佳答案

您的代码中有两个错误:。

  1. *ptr[i][j](*ptr)[i][j]
  2. 不同
  3. float ***tab = NULL; call_alloc(tab,d1,d2); 将 NULL 指针传递给函数 call_alloc

像这样调整你的代码:

int call_alloc(float ***ptr, int d1,int d2)
{
    int i,j;
    *ptr = alloctab(d1,d2);

    for (i=0;i<d1;i++)
    {
        for (j=0;j<d2;j++)
        {
            (*ptr)[i][j]=(float)i+(float)j;
         // ^    ^
            printf("ptr[%d][%d]=%f\n",i,j,(*ptr)[i][j]);
                                       // ^    ^ 
        }
    }
    return 0;
} 

int testmain() 
{
    float **tab = NULL;
       // ^^
    int d1=6,d2=8;
    call_alloc(&tab,d1,d2);
            // ^
    return 0;
}

请注意,您的代码不会释放内存。

关于c - 动态分配二维数组时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35101251/

相关文章:

python - Numpy 数组值在没有被询问的情况下改变了?

java - 使用 "tournament"(Java) 从数组中获取最大的 n 个数字

arrays - Hive中的数组拆分

c++ - 写入SD卡arduino

c++ - 在 MSVC 中将某些库的目标平台版本设置为 10.x 是否会使程序不兼容在 Windows Vista/7/8 上运行?

c - ARM 和 Intel 内部函数是否对 AES 使用相同的子 key 计划?

c - 当用户在 c 中完成输入时停止 for 循环

c++ - 关于 C/C++ 中函数的数组大小太小的警告

PHP 按相同值合并数组

c - 在 LLDB 中将字节数组格式化为 C-89 初始值设定项表达式