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

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

int values[3]; if(1) values = {1,2,3}; printf("%i", values[0]); 

谢谢。

你可以用数据声明静态数组来初始化:

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

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

 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; } } 

在C99中,使用复合文字 ,您可以:

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

要么

 int* values = (int[3]){1, 2, 3}; 
  //compile time initialization int values[3] = {1,2,3}; //run time assignment value[0] = 1; value[1] = 2; value[2] = 3; 
 #include #include #include 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; } 

也可以使用编译器的结构块副本来隐藏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", di[0], di[1], di[2]); return 0; } 

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

 template  struct inner { Array x; }; template  void assign(Array& lhs, const Array& rhs) { inner& l( (inner&)(lhs)); const inner& r( (inner&)(rhs)); l = r; } int main() { int x[100]; int y[100]; assign(x, y); } 

还有这个…… 🙂

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

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

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

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

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

 #include  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; }