通常访问超出其结尾的数组是C中未定义的行为.例如:
int foo[1];
foo[5] = 1; //Undefined behavior
Run Code Online (Sandbox Code Playgroud)
如果我知道数组末尾之后的内存区域是用malloc还是在堆栈上分配的话,它仍然是未定义的行为吗?这是一个例子:
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int len;
int data[1];
} MyStruct;
int main(void)
{
MyStruct *foo = malloc(sizeof(MyStruct) + sizeof(int) * 10);
foo->data[5] = 1;
}
Run Code Online (Sandbox Code Playgroud)
我已经看到在几个地方使用这个模式来制作一个可变长度的结构,它似乎在实践中起作用.这是技术上未定义的行为吗?
在我的回购,git diff而git stash这两个快速运行,在不到一秒钟。但是git stash -p,在显示第一个大块之前需要花费20秒钟。为什么会这样呢?
有时函数返回一个列表,但是你知道它只有一个项目.获得它的一种方法是
a = somefunc()[0]
Run Code Online (Sandbox Code Playgroud)
如果列表中有多个项目,则会以静默方式丢弃它们.
本文建议使用
(a,) = somefunc()
Run Code Online (Sandbox Code Playgroud)
评论建议只是
a, = somefunc()
Run Code Online (Sandbox Code Playgroud)
两者都具有以下优点:具有多个元素的数组给出了ValueError: too many values to unpack.它们还可以处理元组,集合和其他集合.
这些方法是否被认为是Pythonic或混淆?他们有任何缺点吗?
当我size_t在Eclipse中打开声明时,我会stddef.h从GCC获得以下行:
typedef __SIZE_TYPE__ size_t;
我知道它__SIZE_TYPE__没有在任何头文件中定义,但是编译器知道.
但是,Eclipse CDT如何理解__SIZE_TYPE__并且size_t是整数类型,因此它可以进行代码分析等?它是否内置于CDT中?
让我们说我有一个指向int的指针:
int *p = somefunc();
Run Code Online (Sandbox Code Playgroud)
我知道它指向25个整数,逻辑上排列在5x5网格中.我可以使用以下方法访问元素:
p[y*5+x]
Run Code Online (Sandbox Code Playgroud)
或这个:
*(p+y*5+x)
Run Code Online (Sandbox Code Playgroud)
有没有办法将其作为2D阵列访问?
a[y][x]
Run Code Online (Sandbox Code Playgroud)