在gcc -Wall没有警告的情况下编译时我很惊讶.这真的是合法的C吗?编写这样的代码有什么风险?
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int a;
int b;
} MyStruct;
int main(void) {
MyStruct *s = malloc(sizeof(*s)); // as opposed to malloc(sizeof(MyStruct))
s->a = 5;
printf("%d\n", s->a);
}
Run Code Online (Sandbox Code Playgroud) 当我运行以下代码时,它适用于C:
#include<stdio.h>
int main(void)
{
const int x=5;
char arr[x];
printf("%d",sizeof(arr));
}
Run Code Online (Sandbox Code Playgroud)
但是,不仅我之前读过const合格的变量不是real常量(这就是为什么它们不能在case条件下使用switch-case),但IBM的以下链接证实了(IBMLINK)并说:
const int k = 10;
int ary[k]; /* allowed in C++, not legal in C */
Run Code Online (Sandbox Code Playgroud)
为什么我允许const在C中使用合格变量作为数组大小而没有任何错误?
foo(a = b+c);
//new value of a(after the call) = b+c
//but
sizeof(a = b+c);
//new value of a = old value of a
Run Code Online (Sandbox Code Playgroud)
为什么在后一种情况下,赋值语句的结果不会反映在函数的堆栈中(包含上面的代码)?
我试图将一些Java代码转换为C. Java代码如下所示:
public static int minimum( int... minimum ) {
assert( minimum.length > 0 );
if ( minimum.length > 0 )
.... // some code that i am able to translate to C without any hassle
}
Run Code Online (Sandbox Code Playgroud)
现在我通过使用stdarg.h标头并使用提供的宏来了解如何在C中使用varargs .但是我很难做到这一点minimum.length.
我试过strlen但是终端给了我一个与指针转换警告不兼容的整数.在C中有什么方法可以复制与Java相同的东西吗?
请考虑一下
#include <stdio.h>
int main(void) {
int size = 1;
int foo[1];
int bar[size];
int* pfoo = 0;
int* pbar = 0;
printf("%zu %zu\n", sizeof(pfoo = foo), sizeof(pbar = bar));
printf("%p %p\n", pfoo, pbar);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在https://ideone.com/VeiJXH上运行时的输出是
8 8
(无)(零)
我期望pbar被设置为第一个元素的地址bar,因为它bar是一个可变长度数组.我认为sizeof在运行时对可变长度数组进行了评估,这意味着pbar它将是非零的.
这是怎么回事?这不是一个小测验; 这是我在代码中遇到的问题的简化版本.
编辑:我不认为副本有帮助 - 我的问题是关于sizeof不被评估为可变长度数组.