“点”在这里意味着什么?

时间:2012-06-11 05:24:24

标签: c

在一些内存分配中,我发现了这一点。但我不明白。

char * mem_alloc()
{   
    char *point;
    char *a;
    point = (char *)malloc(block_num);

    a = *(char**) point;
    return a;
}   

6 个答案:

答案 0 :(得分:8)

  

char * mem_alloc()

根据我的经验,返回指针的函数几乎总是程序设计有缺陷的标志。这样的指针可以指向以下内容:

  • 一个局部变量(blatant bug,UB)
  • 全局/静态(程序设计不佳,也不是线程安全)
  • 动态内存(程序设计不佳,使用内存的代码应该处理分配,泄漏的可能性很大)
  • 或传递给函数的其中一个参数(程序设计不佳,功能界面模糊)

在这种情况下,它指向动态内存,因此我们可能会假设程序设计不佳以及可能存在内存泄漏。

  

point = (char *)malloc(block_num);

这段代码意味着编写它的人对malloc如何工作以及void指针的工作方式感到困惑。不应该对malloc的结果进行类型转换,请参阅thisthis。强制转换意味着程序员对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

不仅更清晰,而且还具有在NULLstruct 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; 具有不同尺寸或表示的平台上工作的优势。