Tag: 复合文字

复合文字有没有办法在c99中有可变长度?

我知道通过正常声明数组,可以在运行时确定长度的数组: char buf[len]; 而且我知道我可以将数组声明为复合litral并将其分配给中间的指针: char *buf; …. buf = (char[5]) {0}; 但是,将两者结合起来并不起作用(标准不允许)。 我的问题是:有没有办法实现以下代码的效果? (注释len ) char *buf; …. buf = (char[len]) {0}; 谢谢。

引用的复合数组文字的生命周期

我最近才知道我实际上可以在C语言中使用复合文字数组的引用,我发现它很有用,但我不太明白它是如何工作的。 例如,假设我使用该function来避免必须为一个调用声明一个变量一些套接字接口函数,我不关心返回名称长度,如下所示: int sockfamily(int fd) { struct sockaddr_storage ss; getpeername(fd, (struct sockaddr *)&ss, (socklen_t [1]){sizeof(ss)}); return(ss.ss_family); } 显然, sizeof(ss)需要实际存储在堆栈上,以便将指向它的指针传递给getpeername ,因此必须为此目的分配和保留堆栈上的空间,但这个分配的生命周期是多少? 我可以信任多久保持分配? 看一下GCC的汇编输出,我观察到如果我在循环中调用getpeername ,那么循环的多次迭代就不能存在分配,但是其他条件可能导致它不再存在?

为什么C中的复合文字可以修改

人们通常将“不可修改的”与术语“文字”联系起来 char* str = “Hello World!”; *str = ‘B’; // Bus Error! 然而,当使用复合文字时,我很快发现它们是完全可修改的(并且锁定在生成的机器代码中,您会看到它们被推入堆栈中): char* str = (char[]){“Hello World”}; *str = ‘B’; // A-Okay! 我正在使用clang-703.0.29编译。 这两个例子不应该生成完全相同的机器代码吗? 如果它是可修改的,复合文字真的是文字吗? 编辑:一个更短的例子是: “Hello World”[0] = ‘B’; // Bus Error! (char[]){“Hello World”}[0] = ‘B’; // Okay!

在C中初始化指向复合文字的指针

这是一种初始化指针的不常见方式: int *p = (int[10]){[1]=1}; 这里,指针指向复合文字。 #include int main(void) { int *p = (int[10]){[1]=1}; printf(“%d\n”, p[1]); } 输出: 1 该程序在G ++编译器中编译并运行良好。 所以, 这是初始化复合文字指针的正确方法吗? 要么 它是未定义的行为初始化指向复合文字的指针吗?

结构vs字符串文字? 只读与读写?

C99标准是否允许写复合文字(结构)? 它似乎不提供写文字字符串。 我问这个是因为它在C编程:现代方法,第 406页第2版​​中说 。 问:允许指向复合文字的指针似乎可以修改文字。 是这样的吗? 答:是的。 复合文字是可以修改的左值。 但是,我不知道它是如何工作的,以及它如何与字符串文字一起工作,你当然无法修改。 char *foo = “foo bar”; struct bar { char *a; int g; }; struct bar *baz = &(struct bar){.a = “foo bar”, .g = 5}; int main () { // Segfaults // (baz->a)[0] = ‘X’; // printf( “%s”, baz->a ); // Segfaults // foo[0] = […]

在函数调用的参数内定义新函数,数组,结构等

如果你有一个function,采取以下措施: void foo(char **arr); 你怎么能做到以下几点: void foo(char* x[] = { “hello”, “my”, “friend” }); 如果这让您感到困惑,那么在Java中我们通过以下方式做到这一点: public void foo(String[] x); foo(new String[] { “hello”, “my”, “friend” }); 目前,我在C中做了以下我讨厌,因为它看起来很丑: char* myArr[] = { “hello”, “my”, “friend” }; foo(myArr);

如果没有类型转换,为什么复合文字赋值不起作用

我对C中的文字有疑问。 int a; //a is an integer that is assigned an integer literal 414 a = 414; float b; //b is a float that is assigned a float literal of 3.14 b = 3.14; struct point { int x,y; }; struct point b; //{5,6} is a compound literal that is assigned to a struture. b […]

数组为复合文字

在C99中,我们可以将复合文字用作未命名的数组。 但是这个文字常量是例如100 , ‘c’ , 123.4f等。 我注意到我能做到: ((int []) {1,2,3})[0] = 100; 并且,我没有编译错误,并且可以猜测该未命名数组的第一个元素是用100修改的。 所以它似乎作为复合文字的数组是左值而不是常量值。

为什么我不能将常量数组作为参数传递?

在C中,为什么我不能这样做: arrayfn({1.0, 2.0, 3.0}); 如果arrayfn是一个函数,它接受double[]或double*类型的一个参数,无论哪个。 试试这个给我一个语法错误。 有没有一种方法可以在C中实现这样的东西 – 生成并立即传递一个在编译时已知的数组 – 避免不得不花费一行代码预先声明并填​​充它?

复合/字符串文字在哪里存储在内存中?

我看了; 复合文字是C99function,可用于创建没有名称的数组。 考虑这个例子: int *p = (int []){3, 0, 3, 4, 1}; p指向包含3, 0, 3, 4和1个的五元素数组的第一个元素。 其实我想知道,这个数组是否会存储在内存中,因为它没有名字? 换言之,如果是 char* str = “hello” 字符串”hello”将存储在内存中?