[英]Simple C array declaration / assignment question
在更高級別的語言中,我將能夠在C中使用類似於此示例的內容,並且它會很好。 但是,當我編譯這個C例子時,它會痛苦地抱怨。 如何將新數組分配給我聲明的數組?
int values[3];
if(1)
values = {1,2,3};
printf("%i", values[0]);
謝謝。
在聲明數組時,您只能對數組進行多次賦值:
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;
你可以用數據聲明靜態數組來初始化:
static int initvalues[3] = {1,2,3};
…
if(1)
memmove(values,initvalues,sizeof(values));
#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;
}
我會將此作為評論發布,但我沒有足夠的聲譽。 初始化數組的另一種(可能是臟的)方法是將它包裝在結構中。
#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;
}
也可以使用編譯器的結構塊副本來隱藏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;
}
還有這個...... :)
char S[16]="";
strncpy(S,"Zoodlewurdle...",sizeof(S)-1);
測試如果你聲明S [8]或S [32]會發生什么,看看為什么這是如此有效。
我根據OpenBSD strlcpy的邏輯編寫了自己的字符串函數,旨在確保在溢出時必須存在終結符字節,標准strncpy不會這樣做,所以你必須仔細觀察它是如何使用它的。
上面的方法是有效的,因為聲明中的=""
確保整個0字節,而sizeof(S)-1
確保如果你過分傳遞給strncpy的引用字符串,你會得到截斷並且沒有違反最后0字節,所以這現在可以安全地防止溢出,以及稍后訪問字符串。 我的目標是ANSI C,所以它應該在任何地方都是安全的。
這可以在gcc下使用-O3(編譯器完全刪除代碼)更好地工作和優化,而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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.