考虑:
char amessage[] = "now is the time";
char *pmessage = "now is the time";
Run Code Online (Sandbox Code Playgroud)
我从C编程语言第2版中读到,上述两个陈述没有做同样的事情.
我一直认为数组是一种操作指针来存储一些数据的便捷方式,但显然情况并非如此...... C中数组和指针之间的"非平凡"差异是什么?
使用clang编译时没有警告.
typedef struct {
int option;
int value;
} someType;
someType *init(someType *ptr) {
*ptr = (someType) {
.option = ptr->option | ANOTHEROPT,
.value = 1
};
return ptr;
}
int main()
{
someType *typePtr = init( &(someType) {
.option = SOMEOPT
});
// do something else with typePtr
}
Run Code Online (Sandbox Code Playgroud)
这甚至是有效的C吗?
如果是这样的话:复合文字的生命周期是多少?
如何char用字符串(字符数组)初始化指针,但int指针不是整数数组?
当我试着这个
int* a={1,2,3,4,5};
Run Code Online (Sandbox Code Playgroud)
它给出了一个错误说法
错误:标量对象'a'在初始化程序中需要一个元素
但,
char* name="mikhil"
Run Code Online (Sandbox Code Playgroud)
工作得很好.
我最近才知道我实际上可以在C语言中使用复合文字数组的引用,我发现它很有用,但我不太明白它是如何工作的.
例如,假设我使用该功能来避免为一个调用声明一个变量的一些套接字接口函数,我不关心返回名称长度,如下所示:
int sockfamily(int fd)
{
struct sockaddr_storage ss;
getpeername(fd, (struct sockaddr *)&ss, (socklen_t [1]){sizeof(ss)});
return(ss.ss_family);
}
Run Code Online (Sandbox Code Playgroud)
显然,sizeof(ss)需要实际存储在堆栈上以便将指向它的指针传递给getpeername堆栈,因此必须为此分配和保留堆栈上的空间,但这个分配的生命周期是多少?我可以信任多久才能保持分配?
看一下GCC的汇编输出,我观察到如果我把调用getpeername放在一个循环中,那么分配不会在循环的多次迭代中存活,但是其他条件可能导致它不再存在?