关于C语言中的数组

11 浏览
0 Comments

关于C语言中的数组

我写了以下代码(见代码注释以了解问题),\n

#include
int main()
{
    int size;
    scanf("%d",&size);
    int arr[size];    /*这是有效的语句吗?*/
    for(int i=1;i<=size;i++)
    {
        scanf("%d",&arr[i]);
        printf("%d",arr[i]);
    }
    return 0;
}

0
0 Comments

在C语言中,数组的索引是从0开始的,而不是从1开始的,并且不包括数组的大小。这可能会导致一些问题。在下面的代码中,我们可以看到一个循环从0开始,循环条件是i小于数组的大小。在循环体内,我们可以执行一些操作。

然而,这种索引方式可能会导致一些错误。例如,如果我们错误地将数组的大小赋值为数组的长度加1,那么循环将会越界访问数组。这可能导致未定义的行为,使程序崩溃或产生不正确的结果。

为了解决这个问题,我们需要确保正确理解数组索引的工作方式。在C语言中,数组的元素是按照连续的内存地址存储的。数组名本身就是数组的首地址。通过将索引与数组名相加,我们可以访问数组中的元素。

因此,当我们在循环中使用数组索引时,我们应该:

- 从0开始作为索引的初始值,以访问数组的第一个元素。

- 使用小于数组大小的条件进行循环,以确保不越界访问数组。

- 在循环体内执行我们想要的操作,例如修改数组元素的值或输出数组元素。

通过遵循这些规则,我们可以正确地使用数组索引,并避免越界访问数组带来的问题。在实际编程中,我们应该始终注意数组索引的范围,并确保我们的代码在处理数组时是安全的。这样可以确保我们的程序能够正确运行并产生预期的结果。

0
0 Comments

在C90中,无法像上面那样分配动态数组。你需要使用malloc动态分配,如下所示:

int* array = (int*) malloc(sizeof(int) * size);

另外,数组的索引从0开始,而不是1,所以for循环应该从0开始:

for(int i = 0; i < size; i++)

如果使用malloc方法,完成后还需要释放内存:

free(array);

在C规范的较新扩展中,OP的代码是有效的,并且在可用的情况下,这种方法优于malloc。请在你的回答中明确说明"你不能在C中分配动态数组"。这是完全有效的C99代码。谢谢。

0
0 Comments

在C语言中,使用非常量数组大小是有效的C99标准,但不是C90标准。有一个较旧的gcc扩展允许这样做。

需要注意的是,利用这个扩展会使得检查内存分配是否成功更加困难。因此,使用由用户提供的值是不明智的。

简而言之,在C++中,不能以这种方式声明一个在运行时确定长度的数组。在C++中,size必须被声明为const并用整型常量表达式进行初始化(即,一个数值字面量);也就是说,它必须在编译时就已知。

通常情况下,你会使用std::vector,而不是数组。并且它没有像其他一些C99特性一样被引入到C++0X中。我记得g++已经继承了这个gcc扩展。

0