gpt4 book ai didi

c - 异常初始化麻烦

转载 作者:太空宇宙 更新时间:2023-11-04 05:28:57 24 4
gpt4 key购买 nike

全部

我正在编写一个非常简单的动态二维数组声明的 C 代码,并使用 memset 对其进行初始化,然后打印出值。我的代码如下:

float **env;
int i,j,num;

printf("Enter a number : \n");
scanf("%d",&num);

env = (float **)malloc(num*sizeof(float *));

for(i=0;i<num;i++)
{env[i] = (float *)malloc(num*sizeof(float));}

memset(env, 0, sizeof(float)*num*num);

for(i=0;i<num;i++)
{ for (j=0;j<num;j++)
{
printf("%f\t",env[i][j]);
if (j == num -1)
{ printf("\n\n");}
}
}

for(i=0;i<num;i++)
{free(env[i]);
}

free(env);

当我编译程序时,没有编译错误或警告,但是当我尝试打印出值时却无法打印出来。然后我调试了程序,在 memset 语句之后,env 2D 变量显示类似CXX0030:错误:无法计算表达式,当我打印这些值时,会出现一个窗口显示

***.exe 中 0x008b1e27 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000000。

我已经尝试使用 2 个 for 循环将 2D 数组 env 显式初始化为 0,它工作得很好,我也能够打印这些值,但是当我使用 memset 时它不起作用。如果有人可以帮助我,那将非常有帮助。谢谢。

最佳答案

首先,通常的建议是:停止在 sizeof 下使用类型名称并停止转换 malloc 的结果。这是它应该看起来的样子

env = malloc(num * sizeof *env);

for (i = 0; i < num; i++)
env[i] = malloc(num * sizeof *env[i]);

一般来说,更喜欢按照这种模式编写内存分配

some_ptr = malloc(N * sizeof *some_ptr);

其次,您使用此技术创建的“数组”不是经典的 C 风格的连续二维数组。相反,您会得到一个由一堆完全不相关的一维数组组装而成的“模拟”二维数组。后者可能随机分散在内存中。这立即意味着您将无法将数组作为连续对象进行处理。与此同时,您的 memset 调用试图做到这一点。你不能这样做。在您的情况下,您必须使用循环将每个一维子数组独立归零。

但是,您可以将它们全部分配为一个内存块,而不是单独分配一维子数组

assert(num > 0);
env = malloc(num * sizeof *env);
env[0] = malloc(num * num * sizeof *env[0]);

for (i = 1; i < num; ++i)
env[i] = env[i - 1] + num;

如果如上所示分配,数组的数据将存储在一个连续的内存块中,尽管在使用该数组时您仍然需要了解自己在做什么。例如,memset数组数据如下所示

memset(*env, 0, num * num * sizeof **env);

memset(&env[0][0], 0, num * num * sizeof env[0][0]);

(这是一回事)。

关于c - 异常初始化麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13212351/

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