如何用复合字面量初始化动态分配的float3x3矩阵?
正确初始化堆上float3x3矩阵的方法
你当前代码存在两个核心问题:
malloc(sizeof g)取的是指针g的大小,而非float3x3数组的实际内存需求,导致分配空间远小于3x3矩阵所需。- 直接将复合字面量赋值给指针
g,存在类型不匹配问题(复合字面量(float3x3){...}的类型是float[3][3],隐式转换为float(*)[3],而g是float(*)[3][3]),且复合字面量的内存不在堆区,调用free会触发未定义行为。
正确的做法是先分配堆内存,再将复合字面量的内容拷贝到堆内存中,具体代码如下:
#include <stdlib.h> #include <string.h> #include <stdio.h> typedef float float3x3[3][3]; void printfloat3x3(float3x3 mat) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { printf("%.1f ", mat[i][j]); } printf("\n"); } } int main() { // 分配对应数组大小的堆内存:sizeof(float3x3)是整个3x3矩阵的字节数 float3x3 *g = malloc(sizeof(float3x3)); if (g == NULL) { // 处理内存分配失败的情况 return 1; } // 用memcpy将复合字面量的内容拷贝到堆内存 memcpy(*g, (float3x3){ {1, 0, 0}, {0, 1, 0}, {0, 0, 1} }, sizeof(float3x3)); printfloat3x3(*g); free(g); // 此时可以正常释放堆内存 return 0; }
关键细节说明:
float3x3 *g是指向二维数组的指针,*g代表这个二维数组本身,因此memcpy的目标是*g,源为复合字面量。- 必须检查
malloc的返回值,避免空指针操作导致程序崩溃。 - 复合字面量作为临时数组使用,
memcpy会将其所有字节拷贝到堆内存,后续堆内存完全由你掌控,free操作合法且安全。
内容的提问来源于stack exchange,提问作者will r
相关产品推荐
相关产品推荐

