我正在使用 C 开发显示界面。这是简化的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define A_BITMAP {1,2,3}
void getA(int **a){
a[0]=(int*)malloc(12);
memcpy(a[0],(int[])A_BITMAP,12);
}
void main(){
int* a;
getA(&a);
printf("%d",a[2]);
free(a);
}
A_BITMAP
是一张图片的位图数组,我不能修改它的代码。这是我的问题:
有什么办法不使用
memcpy()
来分配给宏A_BITMAP
的malloc(ed) 区域吗?(int[])A_BITMAP
会在堆栈上生成一个大的本地数组吗?图片大小2M左右,这样做安全吗?
最佳答案
你可以那样施法。然而,应该避免转换,因为它基本上是在告诉编译器你比它更了解并禁用它可以做的任何健全性检查。此外,显然您并不真正知道 A_BITMAP 将是 3 个整数,您通过硬编码大小让自己承受了一大堆痛苦。
此外,正如 Sunny 所指出的,它可能会在这样编写时将数组复制到堆栈上(这取决于您的编译器,但我不想冒险)。相信我,您真的不希望堆栈上有一个 2Mb 的数组。
其他几点:
a
不是数组,它是一个指针,所以使用*a
,而不是a[0]
,因为它会混淆读者- 你没有从 main 返回结果,这意味着你的程序 因错误而退出。
你可能想考虑这样的事情:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define A_BITMAP {1,2,3}
void getA(int **a) {
static int data[] = A_BITMAP;
*a = malloc(sizeof(data));
memcpy(*a, data, sizeof(data));
}
int main(){
int* a;
getA(&a);
printf("%d\n", a[2]);
free(a);
return 0;
}
关于C 数组赋值使用大括号语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32111561/