我想使用我的程序:
./program -I /usr/include/ /usr/bin/ /usr/local/include/ ...
Run Code Online (Sandbox Code Playgroud)
交换机可以像var args列表一样继续运行.我怎么能在C99那样做?最好得到一个类似char **args_list或char *args_list[]包含所有喜欢的东西/usr/include和/usr/bin/.
C99标准允许创建灵活的阵列成员,例如
typedef struct pstring {
size_t length;
char string[];
} pstring;
Run Code Online (Sandbox Code Playgroud)
然后用类似的东西初始化pstring* s = malloc(sizeof(pstring) + len).len为零是允许的吗?它似乎是一致的,并且不时地节省空间(pstring当然可能不是这个例子).另一方面,我不知道下面的代码会做什么:
pstring* s = malloc(sizeof(pstring));
s->string;
Run Code Online (Sandbox Code Playgroud)
这看起来似乎可能适用于一个编译器而不是另一个编译器,或者在一个操作系统而不是另一个操作系统上,或者在某一天而不是另一个,所以我真正想知道的是标准对此的说法.这是malloc示例代码中未定义的行为,还是仅对其s->string无效的访问,还是完全不同的其他内容?
免责声明:这是一个编程类,但它不是作业的答案或目的.
我们可以在我的大学访问多个类似*nix的服务器,并鼓励我们在每个服务器上编译我们的项目,以了解不同环境如何改变事物.我目前正在做一个涉及信号的项目,而且我遇到了一些我无法解决的问题.
在基于Solaris的服务器下,一切正常:
xxxxxxx@xxx:~/proj6$ make gcc-new
rm -f ./pr6
gcc -std=c99 -Wall -Wextra -D_POSIX_C_SOURCE=200112L -D_POSIX_PTHREAD_SEMANTICS -o pr6 pr6.2.c pr6_ctime.c pr6_signal.c
pr6_signal.c:64: warning: unused parameter 'sig'
pr6_signal.c:64: warning: unused parameter 'func'
Run Code Online (Sandbox Code Playgroud)
在基于Linux的服务器下,我看到:
xxxxxxx@xxxxx:~/proj6$ make gcc-new
rm -f ./pr6
gcc -std=c99 -Wall -Wextra -D_POSIX_C_SOURCE=200112L -D_POSIX_PTHREAD_SEMANTICS -o pr6 pr6.2.c pr6_ctime.c pr6_signal.c
pr6_signal.c: In function âinstall_signal_handlerâ:
pr6_signal.c:45: error: âSA_RESTARTâ undeclared (first use in this function)
pr6_signal.c:45: error: (Each undeclared identifier is reported only once
pr6_signal.c:45: error: for each function it appears …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个C99程序,我有一个隐式定义的字符串数组:
char *stuff[] = {"hello","pie","deadbeef"};
Run Code Online (Sandbox Code Playgroud)
由于未定义数组维度,因此为每个字符串分配了多少内存?是否所有字符串都分配了与定义中最大字符串相同数量的元素?例如,以下代码是否等同于上面的隐式定义:
char stuff[3][9];
strcpy(stuff[0], "hello");
strcpy(stuff[1], "pie");
strcpy(stuff[2], "deadbeef");
Run Code Online (Sandbox Code Playgroud)
或者每个字符串只分配了它在定义时所需的内存量(即stuff[0]包含6个元素stuff[1]的数组,包含4个元素stuff[2]的数组,并包含9个元素的数组)?
我使用以下函数来计算两年之间的闰日数:
static int CountLeapDays(int startYear, int endYear)
{
int Days = 0;
while (true)
{
if ((startYear % 4 == 0 && startYear % 100 != 0) || startYear % 400 == 0)
Days++;
if (startYear + 1 == endYear) break;
startYear++;
}
return Days;
}
Run Code Online (Sandbox Code Playgroud)
有没有另一种方式来写这个,所以它不需要循环?
由于好奇的定义和范围,typedef我在2 .c文件中写下了C代码:
main.c中
#include <stdio.h>
int main()
{
int a = 5, b = 6;
printf("a = %d, b = %d\n", a, b);
swap(&a, &b);
printf("a = %d, b = %d\n", a, b);
}
Run Code Online (Sandbox Code Playgroud)
swap.c
typedef T;
void swap(T* a, T* b)
{
T t = *a;
*a = *b;
*b = t;
}
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,代码文件可以用Visual Studio C编译器编译(cl.exe /Tc main.c swap.c)
程序运行正常!根据我的理解,typedef需要2个参数,但为什么这个代码编译并运行?
为了进一步分析,在main函数中,我声明了另外2个浮点变量,并尝试在交换2个整数后交换两个,但这次它无法编译(使用cl.exe).令人惊奇的是,代码可以使用Tiny C(tcc.exe main.c swap.c)编译和运行,因此它就像模板方法一样工作!
我理解这个代码永远不应该被执行但是*(NULL)通过C99标准成功编译了吗?
#include <stdio.h>
int main(void) {
*(NULL);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
PS:在ideone上运行它返回0但我不知道正在使用的编译器版本:(
我想知道基本上如何(a const pointer to (a mutable pointer to (a const type)))在 C99 中声明。
假设我有这个呼叫站点:
const uint8_t* result;
create(&result);
Run Code Online (Sandbox Code Playgroud)
void create(const uint8_t * const * resultPtr)在这种情况下声明被调用者的方法是正确的还是意料之外的?我不需要重新分配resultPtr,调用者不应该[从这个角度来看],*resultPtr[0]但我的函数需要分配*resultPtr = ….
我知道 C 和 C++ 是由不同委员会标准化的不同语言。
我知道像 C 一样,效率从一开始就是 C++ 的主要设计目标。所以,我认为如果任何特性不会产生任何运行时开销,并且它是有效的,那么它应该被添加到语言中。该C99标准有一些非常有用和高效的特性,其中之一是复合文字。我在这里阅读了有关编译器文字的信息。
以下是一个程序,显示了复合文字的使用。
#include <stdio.h>
// Structure to represent a 2D point
struct Point
{
int x, y;
};
// Utility function to print a point
void printPoint(struct Point p)
{
printf("%d, %d", p.x, p.y);
}
int main()
{
// Calling printPoint() without creating any temporary
// Point variable in main()
printPoint((struct Point){2, 3});
/* Without compound literal, above statement would have
been written …Run Code Online (Sandbox Code Playgroud) 我想确保给定的字符串文字最终到达的地址是2的倍数,甚至更好的是4。
有什么方法可以做到这一点,最好不使用任何编译器特定的扩展?还是不可能?
我想这样做,因此字符串地址的最低位是0,可以用作标签位。