小编Nya*_*yan的帖子

主函数的返回值范围

关于主要回报值范围的标准说法是什么?说只有255?

因为

int main(void){
return 256;
}
echo $? ;  # out 0
Run Code Online (Sandbox Code Playgroud)

c posix c99 exit-code

21
推荐指数
2
解决办法
7794
查看次数

与malloc/free相比,使用C99 VLA是个好主意吗?

使用C99 VLA是个好主意吗?与malloc/free相比,何时使用VLA是否合适?(因为VLA可能会爆炸堆叠?)

c c99

19
推荐指数
1
解决办法
6998
查看次数

编译器可以在数学上推断/证明吗?

我开始学习函数式编程语言Haskell,ML大多数练习都会展示如下:

   foldr (+) 0 [ 1 ..10]
Run Code Online (Sandbox Code Playgroud)

这相当于

   sum = 0
     for( i in [1..10] ) 
         sum += i
Run Code Online (Sandbox Code Playgroud)

所以这让我想到为什么编译器不能知道这是算术级数并使用O(1)公式来计算?特别是对于FP没有副作用的纯语言?这同样适用

  sum reverse list == sum list
Run Code Online (Sandbox Code Playgroud)

给定一个+ b = b + a和反向定义,编译器/语言可以自动证明吗?

haskell functional-programming ml

16
推荐指数
3
解决办法
653
查看次数

使用malloc分配char数组

嗨,最近我在网上看到了很多代码(也在SO上),如:

   char *p = malloc( sizeof(char) * ( len + 1 ) );
Run Code Online (Sandbox Code Playgroud)

为什么sizeof(char)?这不是必要的,不是吗?或者只是风格问题?它有什么优势?

c malloc sizeof c99 char

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

当p和q指向同一个对象时,"*p = ++(*q)"是否未定义?

在阅读序列点后,我了解到这i = ++i是未定义的.

那么这段代码怎么样:

int i;
int *p = &i;
int *q = &i;
 *p = ++(*q);           // that should also be undefined right?
Run Code Online (Sandbox Code Playgroud)

假设p和q的初始化取决于某些(复杂)条件.他们可能像上面的情况一样指向同一个对象.会发生什么?如果未定义,我们可以使用哪些工具进行检测?

编辑:如果两个指针不应该指向同一个对象,我们可以使用C99限制吗?这是"严格"的意思吗?

c c99 operator-precedence sequence-points

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

使用turbo C有什么问题?

我总是发现有些人(大多数来自印度)正在使用turbo C.我找不到任何理由使用这种过时的编译器...但我不知道在试图告诉他们使用现代编译器时给出的理由是什么( GCC,MSVC,...).

c c99 turbo-c

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

C语言中的泛型编程与void指针

尽管可以使用void指针(泛型指针)在C中编写通用代码,但我发现调试代码非常困难,因为void指针可以在没有编译器警告的情况下采用任何指针类型.(例如,函数foo()接受void指针,它应该是指向struct的指针,但是如果传递char数组,编译器不会抱怨.)在C中使用void指针时,你们都使用什么样的方法/策略?

c generics pointers

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

静态const变量是否是线程安全的?

我想知道静态常量变量是否是线程安全的?

示例代码段:

void foo(int n)
{
     static const char *a[] = {"foo","bar","egg","spam"};
     if( ... ) {
       ...
      }
}
Run Code Online (Sandbox Code Playgroud)

c multithreading

10
推荐指数
3
解决办法
3812
查看次数

避免重复代码

让我说我有:

  switch( choice ) {
  case A:   
     stmt;
     do_stmt_related2A;
  break;

  case B:
     stmt;
     do_stmt_related2B;
  break;

  case C: something_different();
   ...
  }
Run Code Online (Sandbox Code Playgroud)

我怎么能避免重复stmt代码?

但有任何解决方法吗?gcc扩展标签作为值看起来非常适合这种情况.

   switch( choice ) {
     do {
     case A:  ptr = &&A_label;
     break;
     case B:  ptr = &&B_label;
     } while(0);
              stmt;
              goto *ptr;
     case C: ...
Run Code Online (Sandbox Code Playgroud)

是否有任何技巧可以在ANSI-C中做同样的事情?编辑:我当然想到了函数/宏/内联.还有别的吗?这也与表现无关.仅用于教育目的.;)

c c99

9
推荐指数
3
解决办法
898
查看次数

这个黑客是否符合标准?

这就像struct hack.它是否符合标准C?

 // error check omitted!

    typedef struct foo {
       void *data;
       char *comment;
       size_t num_foo;
    }foo;

    foo *new_Foo(size_t num, blah blah)
    {
        foo *f;
        f = malloc(num + sizeof(foo) + MAX_COMMENT_SIZE );
        f->data = f + 1;            // is this OK?
        f->comment = f + 1 + num;
        f->num_foo = num;
        ...
        return f;

}
Run Code Online (Sandbox Code Playgroud)

c

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