如何在C语言中给数组赋值

5

我在以下程序中遇到了错误。我无法弄清楚为什么无法将值存储在数组中。

main()
{
    int A[10];
    A = {3,1,2,3,4,1,5,8,9,0};
    printArr(A,10);
    printf("\n");

    BubbleSort(A,10);

    printArr(A,10);
    printf("\n----------------Bubble Sort Efficiently ---------------------\n");
    printf("\n");

    A = {3,1,2,3,4,1,5,8,9,0};

    BubbleSortEfficient(A,10);
    printArr(A,10);

    return 0;
}

我遇到的错误如下:

73: error: expected expression before ‘{’ token
80: error: expected expression before ‘{’ token

请说明原因,为什么我无法存储数组元素。

4
你不能像这样分配数组。原文:A={3,1,2,3,4,1,5,8,9,0}; - johnchen902
错误提示是什么?在哪一行? - Ran Eldan
73:错误:在“{”标记之前缺少表达式 BubbleSort.c:80:错误:在“{”标记之前缺少表达式 - Nilesh Agrawal
相关问题:https://dev59.com/hHA75IYBdhLWcg3wubqn - Kel
我认为这个问题对我很有用,所以点个赞 :) - 0decimal0
4个回答

9

在 ANSI C 中,没有定义 数组聚合 的语法,除了在数组初始化器中。如果你将初始化和赋值组合起来(严格来说不是赋值,而是初始化的一部分),你的代码将会编译:

int A[10] = {3,1,2,3,4,1,5,8,9,0};

由于无法重新分配数组,因此在第二次调用BubbleSortEfficient之前,您程序的部分应该如下所示:

int B[10] = {3,1,2,3,4,1,5,8,9,0};
BubbleSortEfficient(B, 10);
printArr(B, 10);
编辑:(针对 Keith Thompson 的评论)C99 引入了数组聚合表达式,但是它们不能被赋值给数组,因为标准没有数组赋值。

非常感谢。值得注意的重要事实。 - Nilesh Agrawal
2
C语言确实有数组聚合(“复合字面量”),从C99开始:int[]{1, 2, 3, 4, 5}是一个有效的表达式。但这对于OP来说并没有太大帮助,因为C语言没有数组赋值。 - Keith Thompson
1
@KeithThompson 确实,感谢您的好建议!我编辑了答案并加入了您的观点。谢谢! - Sergey Kalinichenko

4
花括号用于初始化,而不是赋值。您应该能够这样做:
int A[10]={3,1,2,3,4,1,5,8,9,0};

有没有其他的方法再次聚合数组? - Nilesh Agrawal

4

你不能直接对数组进行赋值,因为数组不是可修改的lvalue。然而,如果你将数组封装在一个结构中,那么你可以对结构进行赋值。

struct array {
    int a[10];
};

const struct array x = { {3,1,2,3,4,1,5,8,9,0} };
struct array A;
A = x;
BubbleSort(A.a,10);
A = x;
BubbleSortEfficient(A.a,10);

或者,你可以使用更传统的memcpy()函数:

int A[10];
memcpy(A, (int[]){3,1,2,3,4,1,5,8,9,0}, sizeof(A));

int[]{3,1,2,3,4,1,5,8,9,0}等于(int[]){3,1,2,3,4,1,5,8,9,0}吗?int[]是指将{3,1,2..}(数组字面值)转换为类型int[] - Sayakiss
@Sayakiss:谢谢,我已经更正了答案,应该是(int[]){...}。是的,那是一个复合字面量表达式。 - jxh
我喜欢memcpy的东西!!为它投赞成票。 - Nilesh Agrawal

0

是的,你不能像这样给数组赋值。你必须按照以下方式进行赋值:

'int A[10]={3,1,2,3,4,1,5,8,9,0};'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接