【发布时间】:2015-11-13 16:49:29
【问题描述】:
我正在使用 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左右,安全吗?
【问题讨论】:
-
你的尺码全错了。你 malloc 3 个字节;您尝试从
int的数组中复制 2 个字节(每个可能是 4 个字节)。答案:(1)不——除非你将数组包装在一个结构中; (2) 否 — 不是显示的 3 整数数组。如果你弄乱了一个大数组,那么“复合文字”的数据将存储在某个地方,但不一定在堆栈上。 -
为什么不创建一个全局变量呢?它不会在堆栈上。
-
@JonathanLeffler 你能告诉我“复合文字”在哪里吗? 。数据?这些代码将在用户空间中。谢谢
-
复合文字可以在任何地方;编译器选择。在这种情况下,它甚至可能在文本段中,因为
memcpy()函数承诺不会修改它。但是编译器可能在文本段中有一个副本,该副本在传递给函数之前被复制到堆栈或数据段中的空间——因为复合文字通常是可修改的。这完全取决于编译器。