在一些内存分配中,我发现了这一点。但我不明白。
char * mem_alloc()
{
char *point;
char *a;
point = (char *)malloc(block_num);
a = *(char**) point;
return a;
}
答案 0 :(得分:8)
char * mem_alloc()
根据我的经验,返回指针的函数几乎总是程序设计有缺陷的标志。这样的指针可以指向以下内容:
在这种情况下,它指向动态内存,因此我们可能会假设程序设计不佳以及可能存在内存泄漏。
point = (char *)malloc(block_num);
这段代码意味着编写它的人对malloc如何工作以及void指针的工作方式感到困惑。不应该对malloc的结果进行类型转换,请参阅this和this。强制转换意味着程序员对C语言感到困惑,和/或他们试图在C ++编译器上编译C代码。
“block_num”是可疑的,如果这是一个全局的非常量变量,那么程序设计很差。
a = *(char**) point;
这意味着,获取指向堆上未初始化内存的point的地址,然后假装该点是指向指针的指针,从而将堆的垃圾内容视为指针。然后将指针指向la-la land中的随机位置,返回给调用者。在这样做的同时,造成内存泄漏。
答案 1 :(得分:0)
这似乎设定了一个点的值(这是一个地址)
a = *(char**) point;
上面的语句是类型转换指向`(char **)point'部分中的“指向指针”。
在此之后你有*用于去引用,它将它改为
值(指向指针的指针)
=>指针。
因此,存储在点中的值(而不是地址)被复制到一个。
我仍然不确定为什么写这种代码。
答案 2 :(得分:0)
你发布的代码很愚蠢 - 你确定它已经完成了吗?
“point”和“a”都是指针。
“a”初始化为“指向”...但“点”完全未初始化。如果调用者尝试使用返回值“a”,则会发生错误。
这是另一个例子:
struct Point {
int x;
int y;
};
...
char * mem_alloc (int size)
{
return (char *)malloc (size);
}
...
Point *my_point = (Point *)mem_alloc (sizeof (struct Point));
...
这个片段也很愚蠢......但希望它能说明你所看到的代码背后的理由可能......
答案 3 :(得分:0)
a
包含存储在point
指向的位置的值。由于point
未初始化,因此它指向包含随机值的随机位置,因此现在a
指向它开始的随机值。
所以代码是无操作。
答案 4 :(得分:0)
如果你看一下malloc
的概念,它总是返回分配的内存空间的基地址,malloc
函数的实际语法是
语法:
pointer_to_store_base_add_of_mem = (data_type_of_allocated_memory)malloc(size_of_array)
在上面的例子中,你已经分配了内存的字符类型,因此你使用了(char *),而在block_num中你已经给出了字符数组的大小,而point指针存储了已分配内存的基地址。 / p>
答案 5 :(得分:0)
查看代码chenyoufu123发表评论Lundin的回答:
ptr = (char *)malloc(block_num * size);
for(k=0; k<block_num-1; k++) {
*((char **)(ptr + k*size)) = ptr + (k+1) * size;
}
*((char **)(ptr + k*size)) = NULL;
这仍然是错误的代码,但不是完全无意义的问题的原始代码。特别是与用于从另一个评论创建链接列表的注释一起。
情况是 - 假设代码是“正确的” - 你有一个
struct Node
{
struct Node *next;
/* More members */
};
和size_t size = sizeof(struct Node);
(名称可能会有所不同)。然后
ptr = (char *)malloc(block_num * size);
为block_num
个连续struct Node
s分配内存。通常会将其分配为
struct Node *ptr = malloc(block_num * sizeof *ptr);
循环
for(k=0; k<block_num-1; k++) {
*((char **)(ptr + k*size)) = ptr + (k+1) * size;
}
*((char **)(ptr + k*size)) = NULL;
然后重新解释内存块k * sizeof(struct Node)
开头后面的地址ptr + k*size
,作为指向指针(char**
的指针,但在现今的大多数PC架构中,这并不重要因为所有对象指针具有相同的表示 - 如果它很重要,代码就会被破坏)并将下一个sizeof(struct Node)
大小的内存块的地址写入该位置。由于next
指针是struct Node
的第一个成员,因此将列表中下一个struct Node
的地址写入当前next
的{{1}}指针。最后,最后struct Node
的{{1}}指针设置为next
。
通常的写作方式,
struct Node
不仅更清晰,而且还具有在NULL
和struct Node *ptr = malloc(block_num * sizeof *ptr);
int k;
for(k = 0; k < block_um - 1; ++k)
{
ptr[k].next = &ptr[k+1]; // or ptr + (k+1), if you prefer
}
ptr[block_num-1].next = NULL;
具有不同尺寸或表示的平台上工作的优势。