Tag: 数组

C中的负数组索引

在论坛中C中的负数组上还有其他问题/答案,但我会为32位编译器请求这些答案:如果我们有一个数组定义int test_array[5] = {1,2,3,4,5}; 接下来的语句应该返回test_array[20] , test_array[-2] , test_array[-32764] , test_array[4294967700] (大于32位可以容纳的值), *(a-32764)等 如果索引超出其声明的范围,编译器是否会强制返回任何固定值?

‘sizeof’无效应用于不完整类型’struct array ‘

我试图通过将命令分成单独的文件来组织我的项目,以便于维护。 我遇到的问题是尝试迭代编译时定义的命令数组。 我创建了一个愚蠢的例子来重现我得到的错误。 . ├── CMakeLists.txt ├── commands │ ├── CMakeLists.txt │ ├── command.c │ ├── command.h │ ├── help_command.c │ └── help_command.h └── main.c ./CMakeLists.txt PROJECT(COMMAND_EXAMPLE) SET(SRCS main.c) ADD_SUBDIRECTORY(commands) ADD_EXECUTABLE(test ${SRCS}) 命令/的CMakeLists.txt SET(SRCS ${SRCS} command.c help_command.c) 命令/ command.h #ifndef COMMAND_H #define COMMAND_H struct command { char* name; int (*init)(int argc, char** argv); int (*exec)(void); […]

为什么数组不能在C / C ++中赋值?

可以将结构分配给另一个,这会导致将所有值从struct复制到另一个: struct { int a, b, c; } a, b; … a = b; 但为什么数组不能像这样分配: int a[3], b[3]; … a = b; 因为,严格来说,结构只是具有可变大小元素的数组,那么为什么不允许这样呢? 无论如何,这种任务尚未使用。 当然,似乎只涉及地址,但可以轻松地复制数组(“静态”)。

为什么我不能将二维数组转换为C中的二维指针?

为什么以下程序给出’conversion’ : cannot convert from int[1][1] to int**错误? 我在Windows 7下使用VS2008进行编译。 int main(){ int a[1][1] = {0}; int **p = a; }

用于从C中的字符串/ char数组中删除空格的函数

这里提出的问题与我遇到的问题非常相似。 区别在于我必须将一个参数传递给一个删除空格并返回结果字符串/ char数组的函数。 我得到了代码工作来删除空格但由于某种原因我留下了从原始数组遗留的尾随字符。 我甚至尝试过strncpy,但我遇到了很多错误。 这是我到目前为止: #include #include #define STRINGMAX 1000 /*Maximium input size is 1000 characters*/ char* deblank(char* input) /* deblank accepts a char[] argument and returns a char[] */ { char *output=input; for (int i = 0, j = 0; i “); fgets(input, STRINGMAX, stdin); /* Read up to 1000 characters from stdin […]

静态数组和动态数组中的元素数

找到静态数组和动态数组中元素数量的最快方法是什么?

为什么我和C中的arr 一样有更大的数据类型?

众所周知,如果你在C中以arr[i]访问数组元素,你也可以像i[arr]一样访问元素,因为这些只是归结为*(arr + i)并且加法是可交换的。 我的问题是为什么这适用于大于char数据类型,因为sizeof(char)是1,对我来说这应该只需要一个char来推进指针。 也许这个例子让它更清晰: #include #include struct large { char data[1024]; }; int main( int argc, char * argv[] ) { struct large arr[4]; memset( arr, 0, sizeof( arr ) ); printf( “%lu\n”, sizeof( arr ) ); // prints 4096 strcpy( arr[0].data, “should not be accessed (and is not)” ); strcpy( arr[1].data, “Hello world!” […]

在声明以外的时间初始化C数组?

我在C中知道我可以做到以下几点。 int test[5] = {1, 2, 3, 4, 5}; 现在,这在声明数组时才合法。 但是我想知道为什么以后这样做不合法? 但是后来在该计划中,执行以下操作是不合法的。 test[5] = {10, 20, 30, 40, 50}; 或类似的东西。 为什么是这样? 我知道这不合法,我不是在抱怨,但有人可以给我一个更技术性的解释,为什么我不能这样做? (即不要只说C规范不允许它或类似的东西) 我假设它必须对内存在数组的堆栈上分配的时间做一些事情,所以在那一点C可以自动填充我的值,但那么为什么它不能在以后呢? 多谢你们

通过指针将数组转换为二维数组

是否可以将单维数组转换为二维数组? 我第一次尝试这将是非常容易的,只需将2D数组的指针设置为1D数组的开头,如下所示: int foo[] = {1,2,3,4,5,6}; int bla[2][3] = foo; 因为我可以轻松地创建一个二维数组,如下所示: int bla[2][3] = {1,2,3,4,5,6}; 所以现在的问题是,有没有办法通过指针转换它?

不完整的arrays类型?

当我用gcc -Wall -pedantic -ansi -std=c89编译下面的代码时,它成功编译而没有在指针赋值时给出错误。 请注意,我将int (*)[4]为int (*)[] 。 int arr[4]; int (*p_arr)[] = &arr; 假设有一些理由允许这个(不兼容的?)赋值,当我尝试使用它时,编译器会给出不完整的类型错误error: invalid application of ‘sizeof’ to incomplete type ‘int[]’ 。 (void) sizeof(*p_arr); 这个错误让我想到允许前一个指针赋值p_arr = &arr的用途是什么? 是否按照标准允许此分配? 我使用了不完整的struct / union类型(通常用于前向声明),并且还遇到了错误incomplete array element type 。 但这种incomplete array type对我来说是新的。 是否有可能在C标准中有一个用例?