可以(重新)在一行中(在初始化之后)设置数组的所有值吗?
Posted
技术标签:
【中文标题】可以(重新)在一行中(在初始化之后)设置数组的所有值吗?【英文标题】:Can one (re)set all the values of an array in one line (after it has been initialized)? 【发布时间】:2011-05-16 17:05:06 【问题描述】:在 C 语言中,我知道我可以制作这样的数组
int myarray[5] = a,b,c,d,e;
但是,想象一下数组已经像这样初始化了
int myarray[5];
然后在之后的某个时候,我想设置/更改所有值而不去
myarray[0] = a;
myarray[1] = b;
myarray[2] = c;
myarray[3] = d;
myarray[4] = e;
而是更像
myarray = a,b,c,d,e;
我之所以问这个是因为如果我在堆上声明我的数组,我会像这样初始化数组:
int* myarray = malloc(5*sizeof(int));
然后我希望能够在一行中输入所有值(主要是为了让我的代码看起来更干净)
【问题讨论】:
【参考方案1】:memcpy(myarray, (int [5])a,b,c,d,e, 5*sizeof(int));
【讨论】:
是的。但是当有人使用模板给出 C++ 答案时,它是否需要需要 C++98 的注释?或者当我在 C 中使用函数原型时,我是否需要提及它在 ANSI C 之前的实现中不起作用? C99 是当前的 C 语言。 @R.:不幸的是,很多人都坚持使用 C89,例如微软在 Visual Studio 中仍然不支持 C99,而且许多学生仍然不得不使用过时的编译器,例如 Turbo C。因此,假设大多数人能够使用 C99 特定的功能可能是不合理的。 从现在开始,我将永远设置这样的数组,只是为了酷,被称为天才哈哈。多么美丽的一个班轮,我流下了眼泪。【参考方案2】:这是一个兼容所有标准(C89、C99、C++)的解决方案
它的优点是您只需担心在一个地方输入数据。其他代码都不需要更改 - 没有神奇的数字。数组在堆上声明。数据表声明为 const。
(Click here to try running it in Codepad)
#include<stdio.h>
#include<stdlib.h>
int main()
unsigned int i = 0;
int *myarray = 0;
static const int MYDATA[] = 11, 22, 33, 44, 55;
myarray = (int*)malloc(sizeof(MYDATA));
memcpy(myarray, MYDATA, sizeof(MYDATA));
for(i = 0; i < sizeof(MYDATA)/sizeof(*MYDATA); ++i)
printf("%i\n", myarray[i]);
free(myarray);
return 0;
【讨论】:
MYDATA
也可以声明为static
。
我会投票赞成,但前提是您将 MYDATA
更改为 static
。否则大多数编译器会为它生成非常糟糕的代码。
MYDATA 将在 .text 或 .const 而不是 .data 中,因为它被声明为 const。它在功能内标明,因此链接是内部的。因此,静态不是必需的或有用的。好吧,以我的经验,但也许 caf 和 R 有一个编译器,这是一个问题,所以为了安抚它们,我会编辑。【参考方案3】:
不,C 没有这样的功能。如果要将所有数组元素设置为相同的值,请使用 memset(3)
。
【讨论】:
这个答案可能会产生误导。memset
没有将“数组元素”分配给一个值。它将内存块中的 bytes 分配给特定值。第二个参数将被解释为char
。例如,您不能使用memset
将int[]
的元素初始化为10
。
但是您可以使用它通过传递 255 作为参数来初始化 uint8,16,32,64_t
到 UINT8,16,32,64_MAX
的数组。 :-)
R.: 不,不,不应该使用 255 而应该使用 UCHAR_MAX :)【参考方案4】:
#include<stdio.h>
#include<stdlib.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 main()
int *sz=malloc(5*sizeof(int)),i;
//call
setarray(sz,"10 30");
//output
for(i=0;i<2;i++)
printf("%d\n",sz[i]);
return 0;
【讨论】:
以上是关于可以(重新)在一行中(在初始化之后)设置数组的所有值吗?的主要内容,如果未能解决你的问题,请参考以下文章