C 数组赋值使用大括号语法

C Array assignment uses brace syntax

我正在用 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是一张图片的位图数组,我不能修改它的代码。这是我的问题:

  1. 有没有办法不使用memcpy()来分配给宏A_BITMAP的malloc(ed)区域?

  2. (int[])A_BITMAP会在堆栈上生成一个大的本地数组吗?图片大小2M左右,这样做安全吗?

每次调用函数都会在栈上创建数组。 如果将 A_BITMAP 声明为全局数组会更好,因为它不会在堆栈上分配。

可以那样施法。然而,应该避免转换,因为它基本上是在告诉编译器你比它更了解并禁用它可以做的任何健全性检查。另外,显然你并不知道 A_BITMAP 将是 3 个整数,你通过硬编码大小来让自己承受一大堆痛苦。

此外,正如 Sunny 所指出的那样,它可能会在这样编写时将数组复制到堆栈中(这取决于您的编译器,但我不想冒险)。相信我,您真的不希望堆栈上有一个 2Mb 的数组。

其他几点:

  • a 不是数组,它是一个指针,所以使用 *a,而不是 a[0],因为它与 reader
  • 混淆
  • 你没有 return 来自 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;
}