标签: ansi-c

C中的多维数组:它们是锯齿状的吗?

关于C编程语言(ANSI-C)的一个简单问题:

C中的多维数组是锯齿状的吗?

我的意思是 - 我们在谈论"数组数组"(一个指向内存中其他地址的指针数组),或者这只是"长一维数组"(它是按顺序存储在内存中)?

困扰我的是我有点确定:

matrix[i][j] 相当于 * ( * (matrix + i) + j)

c arrays jagged-arrays multidimensional-array ansi-c

19
推荐指数
2
解决办法
2126
查看次数

我应该使用ANSI C(C89)吗?

这是2012年.我在用C编写一些代码.我还在使用C89吗?还有编译器不支持C99吗?

我不介意用/* */而不是//.

我不确定C89 forbids mixing declarations and code.我倾向于认为在一个地方拥有所有声明实际上更具可读性,如果不是,则该功能太长.

VLA看起来很有用,但我还没有需要它们.

如果我没有令人信服的理由,我应该坚持使用C89吗?还有其他我没有考虑过的事情吗?

c c99 c89 ansi-c

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

ANSI C和ISO C之间有什么区别吗?

我知道C有ANSI标准和ISO标准.这两个标准之间有什么区别吗?如果是这样,他们是什么?如果没有差异那么有两个标准是什么意思?

c standards c99 c89 ansi-c

12
推荐指数
2
解决办法
4789
查看次数

我应该使用"-ansi"或显式"-std = ..."作为编译器标志吗?

我已经读过 ANSI C与ISO C不完全相同,编译器可能对"-ansi"的解释有所不同.(gcc将其映射到C90,clang将其映射到C89)目前我倾向于使用"-std = ..."而不是"-ansi",因为它明确地显示了使用哪个标准.由于我特别感兴趣的是在Linux,Windows和MAC上编译,我担心一些编译器无法理解"-std = ..."而是"-ansi".那么使用一个在另一个上有任何利弊吗?

c compiler-flags c89 ansi-c

12
推荐指数
1
解决办法
7589
查看次数

所有结构标识符都自动向前声明

在回答警告:从链表数组的不兼容指针类型进行赋值时,我注意到任何用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)

c struct c99 incomplete-type ansi-c

12
推荐指数
3
解决办法
309
查看次数

如何在C99运行时计算可变长度数组的大小?

在C89中,数组的长度在编译时是已知的.但是在C99中,对于可变长度数组,在运行之前,数组的长度可能是未知的.

那怎么计算呢?

为什么不能以相同的方式计算动态分配的数组的长度?

c arrays c99 variable-length-array ansi-c

11
推荐指数
2
解决办法
1455
查看次数

字符串数组初始化

这是我的另一个问题的延续.

请考虑以下代码:

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)

有人可以向我解释原因吗?

c string pointers ansi-c

10
推荐指数
1
解决办法
284
查看次数

字符串数组转换

我有以下代码:

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的行上.这确实是非法的代码还是没问题?

谢谢你的回答.我现在知道我的问题在哪里.但是,它提出了一个新问题:

字符串数组初始化

c ansi-c

8
推荐指数
1
解决办法
174
查看次数

关于两个负数的整数除法,C89的行为是什么:向上舍入,向下舍入或未定义?

例如,

如果我写

int var;
var=-8/-5;
Run Code Online (Sandbox Code Playgroud)

根据运算符优先级,-8/-5将等效于((-8)/( - 5)).但C89是否有可能给出两个值,例如-8/5的情况,它可以给出-1或-2.或者它会把它当作两个正整数的划分?

问题是参考KNKing的书(C编程现代方法)

c rounding integer-division c89 ansi-c

8
推荐指数
1
解决办法
431
查看次数

atof() 用于 float 而不是 double

atof() 返回一个双精度值,当我将它分配给一个浮点值时会产生一个警告(是的,我绝对必须使用浮点数)。

所以我的问题是:是否有一个atof()-variant 可用,它返回一个普通的浮点数?或者我是否必须通过演员表来解决这个问题 - 这会很遗憾,因为它浪费了资源来创建一个会立即被丢弃的替身。

c atof ansi-c

7
推荐指数
1
解决办法
7097
查看次数