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

时间:2015-08-20 07:01:48

标签: c arrays pointers stack

我正在使用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,这样做是否安全?

2 个答案:

答案 0 :(得分:1)

可以投射它。但是,应该避免使用转换,因为它基本上告诉编译器你比它更清楚并且禁用它可以做的任何健全性检查。此外,显然你并不知道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;
}

答案 1 :(得分:0)

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