在Visual Studio 2005中,我正在尝试编译.c文件:
int i = 6;
int a[i];
Run Code Online (Sandbox Code Playgroud)
它不起作用,我的编译器遵循哪个标准?
这将是一个新手问题,但我正在尝试使用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中,通常不允许数组的大小为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的情况,这个有效的代码是什么?
我创建了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)
我收到一个错误消息,说图像的定义中未定义宽度和高度。我不明白为什么会收到该错误以及如何解决该错误
我读到需要在编译时知道数组大小.但是,当我这样做时,它编译并运行得很好,没有任何错误......怎么样?
#include <iostream>
int main() {
int size;
std::cout << "Enter size: ";
std::cin >> size;
int a[size];
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在探索如何基于函数签名在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
以下示例演示了此问题:
#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不允许组合和变量数组,那么应该有警告吗?
我试图找到这个,但找不到任何.我知道我可以创建一个数组变量的引用:
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]'的值.任何人都知道如何解决这个问题?提前致谢.
所以我的代码是这样的:
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) 如果我将可变长度数组写为本地,如下所示:
#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)