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

标签 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左右,这样做安全吗?

最佳答案

可以那样施法。然而,应该避免转换,因为它基本上是在告诉编译器你比它更了解并禁用它可以做的任何健全性检查。此外,显然您并不真正知道 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/

相关文章:

c - 为什么数组有时会被越界调用

c - 单个 malloc 中的多个结构调用未定义的行为?

arrays - perl丢弃映射操作中的第一个数组元素

javascript - 将一个数组与另一个数组值拼接

c - C中的双指针

c - 不确定如何正确使用 malloc() 和 free()

c - 在 C 中使用 INSIDE 函数

c - 静态变量的初始化

崩溃,不知道为什么

java - 在 java 对象数组中执行按顺序(按字母顺序)添加