簡體   English   中英

簡單的C數組聲明/賦值問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM