对于这个问题,这可能不是一个非常合适的论坛,但是让我试一试,冒着被搬走的风险.
C++标准库有几个参考,包括非常有价值的ISO标准,MSDN,IBM,cppreference和cplusplus.就个人而言,在编写C++时,我需要一个具有快速随机访问,短加载时间和使用示例的引用,并且我一直在发现cplusplus.com非常有用.但是,我一直在SO上听到关于该网站的负面看法,所以我想具体说明:
cplusplus.com提供的错误,误解或错误建议有哪些?使用它来做出编码决策有哪些风险?
让我补充一点:我希望能够通过标准的准确报价在这里回答问题,因此我想发布可立即使用的链接,而cplusplus.com将是我选择的网站,如果不是这个问题.
传递0到是否有问题memcpy():
memcpy(dest, src, 0)
Run Code Online (Sandbox Code Playgroud)
请注意,在我的代码中,我使用的是变量而不是0有时可以求值的变量0.
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无效的访问,还是完全不同的其他内容?
这个问题和许多更多的是问,如果一个呼叫本网站上的许多问题中的memcpy()是与零值指定的长度\大小有效。回答时,每个人都引用当前的C标准(在本例中为C17 ISO / IEC9899:2017第283页),
如果声明为as的参数
size_tn指定函数数组的长度,则对该函数n的调用的值可以为零。除非在本节中对特定功能的描述中另有明确说明,否则此类调用上的指针参数仍应具有有效值,如7.1.4中所述。在这样的调用中,找不到字符的函数没有出现,比较两个字符序列的函数返回零,而复制字符的函数则复制零字符。
但是,这来自C标准,而C ++标准未引用。
在当前的C ++标准(即C ++ 17 ISO / IEC 14882)的何处列出了相同的定义?C和C ++具有两种不同的标准(和语言),据我所知,您不能引用一个标准并期望在另一个标准中存在相同的规则/行为。
如果C标准中的这种引用在C ++中有效而未在标准中明确说明,那么有人可以提供一个源来备份C和C ++之间的这种连接吗?
int *shiftRmemmove(int *arr, size_t size)\n{\n if(arr && size)\n {\n memmove(arr + size - 1, arr + size - 2, (size - 1) *sizeof(*arr));\n arr[0] = 0;\n }\n return arr;\n}\nRun Code Online (Sandbox Code Playgroud)\n是否定义为size == 1?它正在计算并传递对第一个元素之前的数组元素的引用。它相当于:memove(arr, arr -1, 0); (\xc2\xa9Jabberwocky)