如何在函数的开头声明一个数组,并使用定义的常量稍后对其进行初始化?

时间:2014-03-04 22:04:35

标签: c arrays

我试图在函数的开头声明一个字符数组,然后使用定义的常量初始化它,例如:

#define REV_1    {'A','B','C','D'}
#define REV_2    {'E','F','G','H'}
#define REV_3    {'I','J','K','L'}
void myfunction()
{
    char Rev1[4];
    char Rev2[4];
    char Rev3[4];

    [...a bunch of code here...]

    Rev1 = REV_1;
    Rev2 = REV_2;
    Rev3 = REV_3;
}

但是我收到编译错误告诉我

Error: #29: expected an expression
Error: #137: expression must be a modifiable lvalue

我已经通过执行以下操作获得了代码,但理想情况下我想等到稍后才能初始化数组。

#define REV_1    {'A','B','C','D'}
#define REV_2    {'E','F','G','H'}
#define REV_3    {'I','J','K','L'}
void myfunction()
{
    char Rev1[] = REV_1;
    char Rev2[] = REV_2;
    char Rev3[] = REV_3;
}

我真正想做的是创建一个存储所有3个char数组的2D数组,例如:

#define REV_1    {'A','B','C','D'}
#define REV_2    {'E','F','G','H'}
#define REV_3    {'I','J','K','L'}
void myfunction()
{
    char Revisions[3][4];

    [...a bunch of code here...]

    Revisions[0] = REV_1;
    Revisions[1] = REV_2;
    Revisions[2] = REV_3;
}

有人可以向我解释一下声明数组并使用定义的常量稍后初始化它的正确方法吗?或者更好地解释我将如何使用2D阵列进行此操作?如果这是一个重复的问题我提前道歉,我无法使用搜索找到这个问题的答案。

5 个答案:

答案 0 :(得分:1)

你可以这样做:

// Globals:
static const char rev1_proto[4] = {'A', 'B', 'C', 'D'};

// In the code:
memcpy(Revisions[0], rev1_proto, sizeof(rev1_proto));

这解决了你只能使用声明它的方法定义数组的限制(不是以后,就像你希望的那样)。相反,您将内存中的原型保存在必要时,可以使用memcpy()函数进行复制。

这个方法适用于2D数组 - 它假设你已经在Revisions中为一个数组长度为4个字符的数组分配了内存。

请记住,如果您要尝试打印Revisions数组中的某个条目,它将缺少NULL终止字符,这样就无法工作了。如果你想要,你必须使数组的字符长一个,并在末尾添加一个'\ 0'字符。只有这样你才能printf("%s\n", Revisions[0]);

答案 1 :(得分:1)

您可以像这样创建一个匿名数组:

#include <stdio.h>
#include <string.h>

#define REV_1 ((char[4]){'A', 'B', 'C', 'D'})

int main(void)
{
    char Rev1[4];

    memcpy(Rev1, REV_1, 4);
    printf("%c %c %c %c\n", Rev1[0], Rev1[1], Rev1[2], Rev1[3]);

    return 0;
}

输出:

  

A B C D

答案 2 :(得分:0)

你的问题是“这里的一堆代码”。

你想要什么,只能按你描述的第二种方式工作,因为它是初始化,而不是作业。

如果您想稍后再使用,请使用memcpy

memcpy(Rev1, "ABCD", 4);

答案 3 :(得分:0)

以下语法仅在初始化矩阵/向量时有效。

#define REV_1    {'A','B','C','D'}
#define REV_2    {'E','F','G','H'}
#define REV_3    {'I','J','K','L'}
void myfunction()
{
    char Revisions[3][4]= {REV_1, REV_2, REV3};
}

当为数组赋值(赋值和初始化是不同的东西)时,sintax无效,你必须按值分配值(for / while循环)或复制块(使用memcpy),在你的情况下,假设如果您想跳过初始化,建议使用memcpy,因为您的MACRO的定义方式。

请注意,如果没有显式初始化,全局变量和静态变量初始化为0,如果未初始化,则局部变量将包含随机值,直到您继续进行赋值,以避免这种情况。通常建议将它们初始化为已知值。

答案 4 :(得分:0)

这是我认为最接近你想拥有的东西。不幸的是,我并不是100%清楚它是如何完全成功的,我只知道它...... 解决了:

#include <stdio.h>

#define REV_1   (char [4]) {'A','B','C','D'}
#define REV_2   (char [4]) {'E','F','G','H'}
#define REV_3   (char [4]) {'I','J','K','L'}

int main( ){

    char( *Revisions[3] )[4] = { 0 };
    Revisions[0] = REV_1;
    Revisions[1] = REV_2;
    Revisions[2] = REV_3;

    // displays the content
    for ( int i = 0; i < 3; i++ ) {
        for ( int j = 0; j < 4; j++ ) {
            printf( "%c", ( *Revisions[i] )[j] );

            // rest is just cosmetic
            if ( j != 3 ) putchar( ' ' );
        }
        if ( i != 2 ) putchar( '\n' );
    }

    getchar( );
    return 0;
}

您引用内容的方式略有不足,要求您使用额外的(*),每个都有一个,但这就是我能看到的全部内容。