关于C编程语言(ANSI-C)的一个简单问题:
C中的多维数组是锯齿状的吗?
我的意思是 - 我们在谈论"数组数组"(一个指向内存中其他地址的指针数组),或者这只是"长一维数组"(它是按顺序存储在内存中)?
困扰我的是我有点确定:
matrix[i][j] 相当于 * ( * (matrix + i) + j)
这是2012年.我在用C编写一些代码.我还在使用C89吗?还有编译器不支持C99吗?
我不介意用/* */而不是//.
我不确定C89 forbids mixing declarations and code.我倾向于认为在一个地方拥有所有声明实际上更具可读性,如果不是,则该功能太长.
VLA看起来很有用,但我还没有需要它们.
如果我没有令人信服的理由,我应该坚持使用C89吗?还有其他我没有考虑过的事情吗?
我知道C有ANSI标准和ISO标准.这两个标准之间有什么区别吗?如果是这样,他们是什么?如果没有差异那么有两个标准是什么意思?
我已经读过 ANSI C与ISO C不完全相同,编译器可能对"-ansi"的解释有所不同.(gcc将其映射到C90,clang将其映射到C89)目前我倾向于使用"-std = ..."而不是"-ansi",因为它明确地显示了使用哪个标准.由于我特别感兴趣的是在Linux,Windows和MAC上编译,我担心一些编译器无法理解"-std = ..."而是"-ansi".那么使用一个在另一个上有任何利弊吗?
在回答警告:从链表数组的不兼容指针类型进行赋值时,我注意到任何用struct关键字表示的未声明标识符都被视为前向声明的标识符.
/* Compile with "gcc -std=c99 -W -Wall -O2 -pedantic %" */
#include <stdio.h>
struct foo
{
struct bar *next; /* Linked list */
};
int main(void) {
struct bar *a = 0;
struct baz *b = 0;
struct foo c = {0};
printf("bar -> %p\n", (void *)a);
printf("baz -> %p\n", (void *)b);
printf("foo -> %p, %zu\n", (void *)&c, sizeof c); /* Remove %zu if compiling with -ansi flag */
return …Run Code Online (Sandbox Code Playgroud) 在C89中,数组的长度在编译时是已知的.但是在C99中,对于可变长度数组,在运行之前,数组的长度可能是未知的.
那怎么计算呢?
为什么不能以相同的方式计算动态分配的数组的长度?
这是我的另一个问题的延续.
请考虑以下代码:
char *hi = "hello";
char *array1[3] =
{
hi,
"world",
"there."
};
Run Code Online (Sandbox Code Playgroud)
它没有编译到我的意外(显然我不知道C语法以及我认为)并生成以下错误:
error: initializer element is not constant
Run Code Online (Sandbox Code Playgroud)
如果我将char*更改为char [],则编译正常:
char hi[] = "hello";
char *array1[3] =
{
hi,
"world",
"there."
};
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释原因吗?
我有以下代码:
char *array1[3] =
{
"hello",
"world",
"there."
};
struct locator_t
{
char **t;
int len;
} locator[2] =
{
{
array1,
10
}
};
Run Code Online (Sandbox Code Playgroud)
它用"gcc -Wall -ansi -pedantic"编译好.但是对于另一个工具链(Rowley),它抱怨
warning: initialization from incompatible pointer type
Run Code Online (Sandbox Code Playgroud)
在char**t的行上.这确实是非法的代码还是没问题?
谢谢你的回答.我现在知道我的问题在哪里.但是,它提出了一个新问题:
例如,
如果我写
int var;
var=-8/-5;
Run Code Online (Sandbox Code Playgroud)
根据运算符优先级,-8/-5将等效于((-8)/( - 5)).但C89是否有可能给出两个值,例如-8/5的情况,它可以给出-1或-2.或者它会把它当作两个正整数的划分?
问题是参考KNKing的书(C编程现代方法)
atof() 返回一个双精度值,当我将它分配给一个浮点值时会产生一个警告(是的,我绝对必须使用浮点数)。
所以我的问题是:是否有一个atof()-variant 可用,它返回一个普通的浮点数?或者我是否必须通过演员表来解决这个问题 - 这会很遗憾,因为它浪费了资源来创建一个会立即被丢弃的替身。