【问题标题】:What is wrong with malloc?malloc有什么问题?
【发布时间】:2016-08-21 17:30:39
【问题描述】:

即使我分配 0 字节,程序也能正常工作。我做错了吗?

#include <stdio.h>
#include <stdlib.h>
int main()
{
   char *str;

   printf("memory address of str %p  %p\n",&str,str);
   /* Initial memory allocation */
   str = (char*)malloc(0);

   printf("memory address of str %p  %p\n",&str,str);
   strcpy(str,"abc");
   printf(" string = %s   %p  %p\n", str,&str, str);
   free(str);

   return(0);
}

【问题讨论】:

  • 这取决于你所说的“作品”。
  • 如果您的程序一定会崩溃,那将是定义的行为。但是就像你的车在你离开驻车制动器时不能保证滚滚,如果你不系鞋带你不能保证摔倒,结果是undefined。跨度>
  • 我的意思是我为字符串 abc 分配了 0 个字节
  • 您分配了 0 个字节,这意味着根据规范您不能取消引用该指针。但是,这不是由编译器强制执行的。因此,稍后将超过 0 个字节复制到该内存中不一定会立即使您的程序崩溃。这确实意味着您的程序处于未定义状态,以后的各种调用可能会崩溃。
  • C 语言没有适合初学者的辅助工具。您负责分配足够的内存。您有责任确保代码不会尝试访问越界的内存。

标签: c memory malloc


【解决方案1】:

来自malloc 文档:

如果大小为零,则返回值取决于特定的库 实现(它可能是也可能不是空指针),但返回 指针不应被取消引用。

Open Group 说:

如果请求的空间大小为 0,则行为为 实现定义:返回的值应为空 指针或唯一指针。

这意味着当 size 为 0 时,malloc() 返回 NULL 或之后可以释放的唯一指针。

【讨论】:

  • 那么我如何为字符串分配内存以及我如何知道是否没有分配内存?
  • a) 分配比您需要的多一个字节(对于nul 终止符)。 b) 测试返回值。 c) 阅读malloc 的手册页。
  • // 为字符串分配内存 char* str = (char*) malloc(size); // 知道是否分配了内存 if(str == NULL) return;
  • 仍然没有返回
  • 它可能并不总是返回空指针。它也可以返回一个唯一的指针。
【解决方案2】:

我是不是做错了什么?

是的,你做错的事情是:

str = (char*)malloc(0);
strcpy(str,"abc");

如果您分配 0 个字节,那么您只能在其中存储 0 个字节。不是 4('a'、'b'、'c' 和终止空字符)。

分配一些内存意味着为您保留该内存,但即使某些内存不是为您保留的,您有时仍可以对其进行写入 - 就像没有什么能阻止您在超市将物品放入别人的手推车一样。

【讨论】:

    猜你喜欢
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    相关资源
    最近更新 更多