.动态内存经典题分析(1)

.动态内存经典题分析(1)_第1张图片


题目:

请问运⾏Test 函数会有什么样的结果?

void GetMemory(char *p)
{
  p = (char *)malloc(100);
}

void Test(void)
{
  char *str = NULL;
  GetMemory(str);
  strcpy(str, "hello world");
  printf(str);
}

int main()
{
  Test();
  return 0;
}

代码分析:

  1. 调用函数Test ,随后将char类型的指针str=NULL赋值
  2. 在Test中调用了GetMemory函数
  3. 在GetMemory函数中进行了申请空间一百个字节
  4. 又返回Test函数,进行strcpy将hello world这一串字符串拷贝到了空间str中
  5. 最后输出str

代码的本意:

将值是NULL的str调整,变为100字节的内存空间后,在进行拷贝,最后打印出字符串。

结果:程序崩溃

.动态内存经典题分析(1)_第2张图片

疑点:

  • 没有使用free进行释放申请的空间
  • printf(str)是否写错?

解答:

传参的错误!在普通变量的传参中,若使用指针则是将变量的地址传递给指针后,这个变量的内容会因为地址的传递,而在调用函数中的改变而发生改变。

而在这里,指针变量str传递的只是数值,并不是地址,若要改变str的值,则只能传递str的地址,因为不是传递地址的形式进行传参,这个参数会自己单独开辟一个空间进行调用函数内部的代码运行。

改代码就是如此。

而printf(str)其实是正确的打印方式,在打印的字符串的形式中有一种特殊的写法就是如此。

因为字符串在打印的过程中,其实是将字符串的收个字符的地址传递给了printf进行打印,所以当str是一个指针,且这个指针的值是一个字符串,那么这个指针实际指向的是字符串的首字符。

 .动态内存经典题分析(1)_第3张图片

以上两种写法是一样的,都是正确的!

正确的代码演示:

 

void GetMemory(char **p)
{
  *p = (char *)malloc(100);
}

void Test(void)
{
  char *str = NULL;
  GetMemory(&str);
  strcpy(str, "hello world");
  printf(str);
  free(str);
  str = NULL;
}

int main()
{
  Test();
  return 0;
}

 

你可能感兴趣的:(数据存储,C语言,算法,c语言,数据存储)