【问题标题】:Trying to set a struct's inside array to be initialized in C试图将结构的内部数组设置为在 C 中初始化
【发布时间】:2016-08-13 13:34:31
【问题描述】:

我有这个结构定义:

typedef struct intArray
{
    int myArray[1000];
} intArray;

我的目标是创建一个零的 intArray,我试过这个:

intArray example;
int createArray[1000] = {0};
example.myArray = createArray;

这会导致以下错误消息:

error: assignment to expression with array type

我希望结构自动将数组初始化为 0,但我理解这是不可能的,因为它只是一个类型定义而不是变量。所以我创建了一个并创建了数组,只是尝试分配它,这就是结果。任何建议表示赞赏。

【问题讨论】:

    标签: c arrays struct


    【解决方案1】:

    为什么不使用 memset 将数组归零?此外,正如另一位用户所建议的那样,最好将此内存分配给一个指针......特别是如果您打算在函数之间传递该结构。

    只是一个想法,但这会起作用:

    typedef struct intArray {
        int *myArray;
    } intArray;
    
    int main(void)
    {
        intArray a;
        int b;
    
        // malloc() and zero the array
        //         
        // Heh...yeah, always check return value -- thanks,
        // Bob__ - much obliged, sir.
        //              
        if ((a.myArray = calloc(1000, sizeof *a.myArray)) == NULL) {
            perror("malloc()");
            exit(EXIT_FAILURE);
        }
    
        memset(a.myArray, 0, (1000 * sizeof(int)));
    
        // Fill the array with some values
        //
        for (b = 0; b < 1000; b++)
            a.myArray[b] = b;
    
        // Just to make sure all is well...yep, this works.
        //
        for (b = 999; b >= 0; b--)
            fprintf(stdout, "myArray[%i] = %i\n", b, a.myArray[b]);
    
        free(a.myArray);
    
    }
    

    【讨论】:

    • 考虑改用calloc()a.myArray = calloc(1000, sizeof *a.myArray);。另外,记得检查返回值。
    • 注意到了,非常感谢。
    • 嗯,使用calloc()的意义在于它already zeroes all the bits... ;)
    • 嘿...是的 - 这会大大缩短我的答案。
    【解决方案2】:

    int myArray[1000]; 这样声明数组不会让您更改数组指针的值。像这样声明你的结构

    typedef struct intArray
    {
        int *myArray;
    } intArray;
    

    如果可以的话。

    【讨论】:

    • 我认为这可以避免给定的错误,但它不会让您面临可能更糟糕的运行时问题吗?例如,如果您在本地声明一个数组并将其分配给指针,那么一旦您退出声明该数组的范围,它将被释放,我不确定当您尝试通过以下方式访问该内存时会发生什么指针。
    • 如果他想访问其范围之外的数组,他不应该首先使用malloc 声明它吗?
    • 但是以这种方式声明 (int *myArray) 我无法控制整数的最大数量。我应该这样做,然后在创建结构后使用 malloc 分配内存吗?
    • ints 的数量由您的createArray 声明决定。 example.myArray = createArray; 只会将声明的内存地址复制到myArray
    • 是的,您可以在声明结构后使用malloc()example.myArray = malloc(sizeof(int)*1000); 分配内存(如果这是您所要求的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 2021-08-02
    • 1970-01-01
    • 2010-09-23
    • 2010-12-06
    • 1970-01-01
    相关资源
    最近更新 更多