可以(重新)在一行中(在初始化之后)设置数组的所有值吗?

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。例如,您不能使用memsetint[] 的元素初始化为10 但是您可以使用它通过传递 255 作为参数来初始化 uint8,16,32,64_tUINT8,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;

【讨论】:

以上是关于可以(重新)在一行中(在初始化之后)设置数组的所有值吗?的主要内容,如果未能解决你的问题,请参考以下文章

Git重新初始化的所有过程

Handsontable - 手动重新渲染网格

将布尔数组中的所有值设置为 true

如何在Java中初始化数组中的所有整数?

Visual Studio 2005怎么恢复到初始设置啊

重新学习C语言day06