【问题标题】:why malloc is returing o as default in gcc compiler? [closed]为什么 malloc 在 gcc 编译器中将 o 作为默认值? [关闭]
【发布时间】:2014-08-21 06:24:24
【问题描述】:

您好,我在这里新学习,请解释下面的问题,我从很多天开始自己学习,我确实有一些 malloc 函数的问题。请帮助我了解这个网站,它不适合初学者,但我无法找到其他方法来找到解决方案

 1) p=malloc(0) // what  will it return ?when i calculate size using sideof operator   it    throw 4 byte?

2) int *p=malloc(4) // when i scan string it throw 0 why sir?

3)  *p=2   // while p is store in heap
   scanf("%d",*p)//why *p is not possible to scanf here *p why p only?

  4) int *p=(int*)malloc(20*sizeof(int))
  for(i=0;i<5;i++)
p[i]=i+1;
free(p);
//now after free i am still get same previos value.. why not garbage coz malloc default value is garbage?

5)   int main()
{
 int *p;
 p=(int*)malloc(4);
 printf("%d\n",*p); // even here i am getting 0 why nt garbage?
 }

谢谢楼主

【问题讨论】:

  • malloc(0) 返回的 what 并不重要。您最多可以在返回的地址存储零字节,因此它是不可观察的。您需要知道的是,您可以而且必须最终将结果传递给free
  • 一一提问。
  • “我仍然得到相同的 previos 值.. 为什么不是垃圾......我得到 0 为什么 nt 垃圾?” -- “垃圾”不是一个特定的可识别值。
  • 函数不会抛出。他们返回
  • 问题太多……太宽泛了。

标签: c pointers malloc


【解决方案1】:

“释放”的意思是“再次可供分配”。不会自动删除/覆盖内存内容,因为它会对性能产生负面影响。如果您希望将区域设置为一个值,则必须在调用 free() 之前自己完成。不过,这在发布代码中是不好的做法(出于数据安全原因之外的任何其他原因)。

在分配内存时也是如此:它不会被设置为任何特定的值,而是包含它之前恰好包含的内容。如果您希望将其初始化为零,请使用calloc()。如果要将其设置为特定的其他值,请在分配后使用memset()。同样,请考虑这会影响性能,并且通常没有必要。

至于你的最后一个问题,"%d"signed 整数。对于未签名的,请使用"%u"

【讨论】:

  • thank u sir please explain 3) *p=2 // 虽然 p 存储在堆中 scanf("%d",*p)//为什么 *p 不能在这里 scanf 为什么 p只有?
  • @SumitKumar scanf 需要一个变量的地址,而不是它的值!当你使用scanf("%d",*p) 编译时,它会给你警告warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘int’* 是一个解引用运算符。所以这里 *p 是一个值@p。
  • @SumitKumar:请参阅您正在使用的函数的文档。它期望 pointers 作为参数(即p)。传递一个值(即*p)将使scanf() 将接收到的输入写入地址 0x00000002(*p 的值解释为指针)——这很可能是一个致命错误。 (而且我们不会在这里互相“先生”,放松。;-))
  • @DevSolar 非常感谢您
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
相关资源
最近更新 更多