【问题标题】:C Array assignment uses brace syntaxC 数组赋值使用大括号语法
【发布时间】: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 是一张图片的位图数组,我不能修改它的代码。这是我的问题:

  1. 有没有什么办法不使用memcpy()通过宏A_BITMAP分配给malloc(ed)区域?

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

【问题讨论】:

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

标签: c arrays pointers stack


【解决方案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;
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多