首页 > 系统相关 >[C语言]动态内存分配遇上函数-经典错误纠错

[C语言]动态内存分配遇上函数-经典错误纠错

时间:2023-10-02 13:55:43浏览次数:37  
标签:动态内存 C语言 char 内存 str Test 纠错 GetMemory 指针

题目来自nice2016校招笔试题

直接完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void GetMemory(char* p)   //申请内存
{
	p = (char*)malloc(100);  
}

void Test()
{
	char* str = NULL;
	GetMemory(str);
	strcpy(str, "hello world"); //复制字符串
	printf(str);  //输出字符串
}

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

分析

推测这段代码的的目的是通过GetMemory函数申请内存,然后把返回的地址存入指针变量str,再把字符串"hello world"复制到str所指向的内存中,最后printf输出

逐步纠错

GetMemory
  1. 首先是传参错误。若在函数内修改外部的一级指针,不能直接将外部一级指针作为实参传入:因为函数会将实参赋给形参,程序运行到大括号外面后,形参被销毁,实参没有变化。所以应该使用char** p二级指针作为形参,储存地址时使用*p\
  2. 其次是内存泄漏。开辟的内存的地址并没有传递给实参,形参又最后销毁了,同时没有释放内存,函数运行完后申请的内存无法找到,导致最终无法释放,造成内存泄漏
//更合适的代码
void GetMenmory(char** p)
{
    *p = (char*)malloc(100);
}

Test
  1. NULL的大问题。假设malloc返回的地址已经存入str,但任然缺少对空指针的判断,导致strcmp中传入了空指针->报错;printf中传入空指针->报错
  2. 没有释放内存->内存泄漏。
//更适合的代码
void Test()
{
    char* str = NULL;
    GetMemory(str);
    if(str == MULL)
    {
        return;
    }
    strcpy(str,"hello world");
    printf("%s\n",str);
    free(str); //防止内存泄漏
    str = NULL; //清除野指针
}

标签:动态内存,C语言,char,内存,str,Test,纠错,GetMemory,指针
From: https://www.cnblogs.com/SDF0521/p/17739897.html

相关文章

  • C语言中floatVSdouble
    关于浮点数的科学计数法和浮点数之间的比较////Createdby王东梁on2023/9/14.//#include<stdio.h>#include<math.h>intmain(){doubleff=123.666;printf("%e,%E,%f,%lf\n",ff,ff,ff,ff);printf("----------------------\n");doub......
  • 实验1 C语言输入输出和简单程序编写
    1.实验任务1task1_1.c源代码1#include<stdio.h>2intmain()3{4printf("o\n");5printf("<H>\n");6printf("II\n");7printf("o\n");8printf("<H>\n"......
  • 实验1c语言的简单输入输出和简单程序编写
    实验1#include<stdio.h>#include<stdlib.h>intmain(){printf("0\n");printf("<H>\n");printf("II\n");system("pause");return0;}实验2#include<stdio.h>#include<stdlib.......
  • C语言的二进制
    32位最大值为什么是2^31-1计算机里面是用补码表示数字,因为要区分正负,用最高位来区分,0位正,1为负。剩下2^31,除去0就是(2^31)-1另外1开头是负数,范围就是-2^31到+(2^31)-1 int_max二进制如下,首位的0为符号位01111111111111111111111111111111如果int_max+1,则......
  • 实验1C语言输入输出和简单程序编写
    1.实验1实验1.1源代码 1//打印一个字符小人23#include<stdio.h>4intmain()5{6printf("0\n");7printf("<H>\n");8printf("II\n");9printf("0\n");10printf("<H>......
  • 【C语言入门】第一天
    [例题1]输入两个正整数a和b,输出a+b的值。其中a,b<10000.#include<stdio.h>intmain(){inta,b;scanf("%d%d",&a,&b);printf("%d",(a+b));return0;}[例题2]先输入一个t(t<100),然后输入t组数据。对于每组数据,输入两个整数a和b,输出a+b值......
  • C语言学习记录---数组1
    BIT-4-数组一维数组的创建和初始化一维数组的使用一维数组在内存中的存储二维数组的创建和初始化二维数组的使用二维数组在内存中的存储数组越界数组作为函数参数数组的应用实例1:三子棋数组的应用实例2:扫雷游戏1.一维数组的创建和初始化。1.1数组的创建数组是一组相同类型元素......
  • 实验一 C语言输入输出和简单程序编写
    实验任务一1#include<stdio.h>2#include<stdlib.h>3intmain()4{5printf("0\n");6printf("<H>\n");7printf("||\n");8printf("0\n");9print......
  • 实验1—C语言输入输出和简单程序应用编写
    1.实验1实验1_1源代码1#include<stdio.h>2#include<stdlib.h>3intmain()4{5printf("O\n");6printf("<H>\n");7printf("II\n");8printf("\n");9printf("......
  • 实验1 C语言输入输出和简单程序编写
    task1.c代码1#include<stdio.h>2intmain()3{4printf("O\n");5printf("<H>\n");6printf("II\n");7return0;8}task1.c运行截图 task1-1.c代码1#include<stdio.h>2int......