在更高级的语言中,我可以在 C 语言中使用类似于这个示例的东西,这会很好。但是,当我编译这个 C 示例时,它抱怨得很厉害。如何将新数组分配给我声明的数组?
int values[3];
if(1)
values = {1,2,3};
printf("%i", values[0]);
谢谢。
在更高级的语言中,我可以在 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;
}
还有这个... :)
char S[16]="";
strncpy(S,"Zoodlewurdle...",sizeof(S)-1);
测试如果你声明 S[8] 或 S[32] 会发生什么,看看为什么它如此有效。
我根据 OpenBSD 的 strlcpy 的逻辑编写了自己的字符串函数,旨在确保在发生溢出时必须存在终止符字节,而标准 strncpy 不会这样做,因此您必须仔细观察如何使用它。
上面的方法是有效的,因为=""
at 声明确保整个 0 字节,并sizeof(S)-1
确保如果你过度使用传递给 strncpy 的引用字符串,你会被截断并且不会违反最后一个 0 字节,所以现在可以安全地防止溢出,并且在访问时后面的字符串。我的目标是 ANSI C,所以它在任何地方都应该是安全的。
也可以通过使用编译器的结构块副本来隐藏 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;
}
我会将此作为评论发布,但我没有足够的声誉。初始化数组的另一种(可能是肮脏的)方法是将其包装在结构中。
#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;
}
这在 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);
}