简单的C数组声明/赋值问题

时间:2009-10-17 13:00:12

标签: c arrays declaration variable-assignment

在更高级别的语言中,我可以在C语言中使用类似于此示例的内容,这样就可以了。但是,当我编译这个C例子时,它会痛苦地抱怨。如何将新数组分配给我声明的数组?

int values[3];

if(1)
   values = {1,2,3};

printf("%i", values[0]);

感谢。

9 个答案:

答案 0 :(得分:12)

当您声明数组时,您只能对数组进行多次赋值:

int values[3] = {1,2,3};

声明后,您必须单独分配每个值,即

if (1) 
{
  values[0] = 1;
  values[1] = 2;
  values[2] = 3;
}

或者您可以使用循环,具体取决于您要使用的值。

if (1)
{
  for (i = 0 ; i < 3 ; i++)
  { 
    values[i] = i+1;
  }
}

答案 1 :(得分:7)

在C99中,使用compound literals,你可以这样做:

memcpy(values, (int[3]){1, 2, 3}, sizeof(int[3]));

int* values = (int[3]){1, 2, 3};

答案 2 :(得分:3)

 //compile time initialization
 int values[3] = {1,2,3};

//run time assignment
 value[0] = 1;
 value[1] = 2;
 value[2] = 3;

答案 3 :(得分:2)

您可以使用数据声明静态数组,以便从以下位置进行初始化:

static int initvalues[3] = {1,2,3};
…
if(1)
    memmove(values,initvalues,sizeof(values));

答案 4 :(得分:1)

#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>

int *setarray(int *ar,char *str)
{
    int offset,n,i=0;
    while (sscanf(str, " %d%n", &n, &offset)==1)
    {
        ar[i]=n;
        str+=offset;
        i+=1;
    }
    return ar;
}

int *setarray2(int *ar,int num,...)
{
   va_list valist;
   int i;
   va_start(valist, num);

   for (i = 0; i < num; i++) 
        ar[i] = va_arg(valist, int);
   va_end(valist);
   return ar;
}

int main()
{
    int *size=malloc(3*sizeof(int*)),i;
    setarray(size,"1 2 3");

    for(i=0;i<3;i++)
        printf("%d\n",size[i]);

    setarray2(size,3 ,4,5,6);
    for(i=0;i<3;i++)
        printf("%d\n",size[i]);

    return 0;
}

答案 5 :(得分:0)

也可以使用编译器的结构块副本来隐藏memcpy。由于所有.i和i,它使代码变得丑陋:但也许它可以解决您的具体问题。

typedef struct {
    int i[3];
} inta;

int main()
{
    inta d = {i:{1, 2, 3}};

    if (1)
        d = (inta){i:{4, 5, 6}};

    printf("%d %d %d\n", d.i[0], d.i[1], d.i[2]);

    return 0;
}

答案 6 :(得分:0)

还有这个......:)

char S[16]="";
strncpy(S,"Zoodlewurdle...",sizeof(S)-1);

测试如果声明S [8]或S [32]会发生什么,看看为什么这样有效。

我根据OpenBSD strlcpy的逻辑编写了自己的字符串函数,旨在确保在溢出时必须存在终结符字节,标准strncpy不会这样做,所以你必须仔细观察如何使用它。

上面的方法是有效的,因为="" at声明确保整个0字节,而sizeof(S)-1确保如果你过分传递给strncpy的带引号的字符串,你会得到截断并且不会违反最后的0 byte,所以现在可以安全地防止溢出,以及稍后访问字符串。我的目标是ANSI C,所以它应该在任何地方都是安全的。

答案 7 :(得分:0)

我会将此作为评论发布,但我没有足够的声誉。初始化数组的另一种(可能是脏的)方法是将它包装在结构中。

#include <stdio.h>

struct wrapper { int array[3]; };

int main(){
    struct wrapper a;
    struct wrapper b = {{1, 2, 3}};

    a = b;

    printf("%i %i %i", a.array[0], a.array[1], a.array[2]);

    return 0;
}

答案 8 :(得分:-1)

使用-O3(编译器完全删除代码)在gcc下更好地工作和优化,而memcpy强制在所有情况下复制内存。

template <typename Array>
struct inner
{
    Array x;
};


template <typename Array>
void assign(Array& lhs, const Array& rhs)
{
    inner<Array>& l( (inner<Array>&)(lhs));
    const inner<Array>& r( (inner<Array>&)(rhs));
    l = r;
}

int main()
{
    int x[100];
    int y[100];

    assign(x, y);
}