标签: variable-length-array

C中不支持可变长度数组C99

在Visual Studio 2005中,我正在尝试编译.c文件:

int i = 6;
int a[i];
Run Code Online (Sandbox Code Playgroud)

它不起作用,我的编译器遵循哪个标准?

c variable-length-array

4
推荐指数
1
解决办法
894
查看次数

我应该信任哪个编译器?

这将是一个新手问题,但我正在尝试使用C语言(而不是C++)进行一个小练习,我遇到了一些问题.

假设我想在一个方法中使用一个数组,该方法的大小取决于其中一个参数:

void someFunc(int arSize)
{
    char charArray[arSize];
    // DO STUFF
    ...
}
Run Code Online (Sandbox Code Playgroud)

当我尝试将其编译为Visual Studio 2013中.c文件时,我收到一条错误消息,指出不允许使用非常量数组.但是,相同的代码在GNU编译器下的CodeBlocks中工作.我应该相信哪一个?编译器的行为是否正常?我一直认为,如果你正在做一些编译器不喜欢的事情,你不应该首先做它,因为它不是标准.

任何输入都很有用!我来自Python背景,我正在尝试更多地参与数据结构和算法的编程.

您可以告诉我的平台是Windows.如果这个问题需要更多信息才能回答,请告诉我.

c arrays gcc visual-studio variable-length-array

4
推荐指数
1
解决办法
1159
查看次数

长度为0的可变长度数组?

在C中,通常不允许数组的大小为0(除非我使用一个或其他编译器端扩展).

OTOH,有长度可能为0的VLA.

他们被允许吗?

我在谈论以下代码:

void send_stuff()
{
    char data[4 * !!flag1 + 2 * !!flag2];
    uint8_t cursor = 0;
    if (flag1) {
        // fill 4 bytes of data into &data[cursor]
        cursor += 4;
    }
    if (flag2) {
        // fill 2 bytes of data into &data[cursor]
        cursor += 2;
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是一个data长度为0,2,4或6 的数组,具体取决于标志的组合.

现在的问题是:对于数组结果长度为0的情况,这个有效的代码是什么?

c c99 language-lawyer variable-length-array

4
推荐指数
1
解决办法
2870
查看次数

结构中可变长度的数组

我创建了2个结构来表示C中的图像(一个像素和一个图像)。

typedef struct pixel {
    unsigned char red;
    unsigned char green;
    unsigned char blue;
};

typedef struct image {
    int width;
    int heigth;
    struct pixel pixels[width][heigth];
    };
Run Code Online (Sandbox Code Playgroud)

我收到一个错误消息,说图像的定义中未定义宽度和高度。我不明白为什么会收到该错误以及如何解决该错误

c arrays struct variable-length-array

4
推荐指数
2
解决办法
4934
查看次数

C++允许我在运行时分配一个数组而不是给出错误

我读到需要在编译时知道数组大小.但是,当我这样做时,它编译并运行得很好,没有任何错误......怎么样?

#include <iostream>

int main() {
    int size;
    std::cout << "Enter size: ";
    std::cin >> size;
    int a[size];

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ variable-length-array

4
推荐指数
1
解决办法
93
查看次数

对C99可变长度数组(VLA)使用限制限定符

我正在探索如何基于函数签名在C99中简单循环的不同实现自动矢量化。

这是我的代码:

/* #define PRAGMA_SIMD _Pragma("simd") */
#define PRAGMA_SIMD

#ifdef __INTEL_COMPILER
#define ASSUME_ALIGNED(a) __assume_aligned(a,64)
#else
#define ASSUME_ALIGNED(a)
#endif

#ifndef ARRAY_RESTRICT
#define ARRAY_RESTRICT
#endif

void foo1(double * restrict a, const double * restrict b, const double * restrict c) 
{ 
    ASSUME_ALIGNED(a);
    ASSUME_ALIGNED(b);
    ASSUME_ALIGNED(c);
    PRAGMA_SIMD
    for (int i = 0; i < 2048; ++i) {
        if (c[i] > 0) {
            a[i] = b[i];
        } else {
            a[i] = 0.0;
        } 
    }
}

void foo2(double * restrict a, const double * restrict b, …
Run Code Online (Sandbox Code Playgroud)

simd c99 variable-length-array restrict-qualifier auto-vectorization

4
推荐指数
1
解决办法
747
查看次数

跳转到转到VLA阵列时的分段错误

以下示例演示了此问题:

#include <cstdio>

int main()
{
        unsigned int remaining=1;

        goto loop;

        while(remaining) {
                unsigned char tmp[remaining];
                printf("&tmp: %p\n",tmp);
loop:
                remaining = 512;//or something else;
        }
}
Run Code Online (Sandbox Code Playgroud)

最初,"剩余"变量的初始化有点长,我曾经goto在一行初始化它.但是,现在这个例子给出了printf线路上的分段错误.

看起来数组没有正确初始化.

即使gdb也无法打印tmp数组的地址:

Program received signal SIGSEGV, Segmentation fault.
0x00000000004005b8 in main () at test.cpp:11
11          printf("&tmp: %p\n",tmp);
(gdb) p tmp
$1 = 0xfffffffffffffe00 <error: Cannot access memory at address 0xfffffffffffffe00>
Run Code Online (Sandbox Code Playgroud)

我的gcc版本:

gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Run Code Online (Sandbox Code Playgroud)

编译:

g++ -o testc test.cpp
Run Code Online (Sandbox Code Playgroud)

如果我删除goto,或用固定数组替换可变参数数组,分段错误就消失了.实际上发生了什么?

这是一个gcc bug吗?如果goto不允许组合和变量数组,那么应该有警告吗?

c++ gcc variable-length-array

4
推荐指数
1
解决办法
308
查看次数

引用在运行时确定的大小数组

我试图找到这个,但找不到任何.我知道我可以创建一个数组变量的引用:

int x[10] = {}; int (&y)[10] = x;
Run Code Online (Sandbox Code Playgroud)

但是,在编译时不知道数组大小的情况下,如下面的代码所示:

const int n = atoi( string ); //the string is read from a text file at run time.
int x[n] = {}; int (&y)[n] = x; //this generates a compiling error.
Run Code Online (Sandbox Code Playgroud)

即使int n被声明为const,只要在编译时不知道n,引用就是无效的.编译器会这样说:类型'int [n]'的引用不能绑定到不相关类型'int [n]'的值.任何人都知道如何解决这个问题?提前致谢.

c++ arrays reference variable-length-array

4
推荐指数
1
解决办法
100
查看次数

我可以用这种方式制作动态阵列吗?

所以我的代码是这样的:

int a, b;
printf("Give dimensions\n");
scanf("%d %d", &a, &b);
double array1[a][b];
printf("Give values\n");
int i, j;
for(i=0; i<a; i++)
{
    for(j=0; j<b; j++)
    {
        scanf("%lf", &array1[i][j]);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,我被告知这是一种分配内存的错误方法,我应该使用malloc.我应该使用用户的维度创建一个动态数组.

编辑:程序的其余部分:

double sum=0;
for(i=0; i<a; i++)
{
    for(j=0; j<b; j++)
    {
        sum = sum + array1[i][j];
    }
    printf("Line %d: sum = %lf\n", i+1, sum);
    sum=0;
}
Run Code Online (Sandbox Code Playgroud)

c arrays dynamic-memory-allocation variable-length-array

4
推荐指数
3
解决办法
224
查看次数

为什么不工作变长数组作为全局?

如果我将可变长度数组写为本地,如下所示:

#include <stdio.h>

int main()
{
    int i=1;
    int a[i];
    printf("%zu",sizeof(a));
}
Run Code Online (Sandbox Code Playgroud)

它在GCC编译器中运行良好.

但是,如果我将可变长度数组写为全局,如下所示:

#include <stdio.h>
int i=1;
int a[i];
int main()
{
    printf("%zu",sizeof(a));
}
Run Code Online (Sandbox Code Playgroud)

然后,GCC编译器给出以下错误:

prog.c:4:5: error: variably modified 'a' at file scope
  int a[i];
Run Code Online (Sandbox Code Playgroud)

c gcc variable-length-array

4
推荐指数
4
解决办法
913
查看次数