MST
星途 面试题库

面试题:C语言结构体指针传递函数中的内存管理

假设你有一个结构体,其中包含一个动态分配内存的成员(如字符数组)。编写一个函数,该函数接收这个结构体的指针,在函数内部修改该动态分配内存的内容,然后在主函数中调用此函数,并确保整个过程中没有内存泄漏,阐述在这个过程中内存管理需要注意的要点。
48.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义结构体
typedef struct {
    char *str;
} MyStruct;

// 修改动态分配内存内容的函数
void modifyStruct(MyStruct *s, const char *newStr) {
    // 释放旧的内存
    free(s->str);
    // 分配新的内存
    s->str = (char *)malloc(strlen(newStr) + 1);
    if (s->str == NULL) {
        perror("malloc");
        exit(EXIT_FAILURE);
    }
    // 复制新字符串
    strcpy(s->str, newStr);
}

int main() {
    MyStruct s;
    s.str = (char *)malloc(10);
    if (s.str == NULL) {
        perror("malloc");
        return 1;
    }
    strcpy(s.str, "old");

    modifyStruct(&s, "new");
    printf("Modified string: %s\n", s.str);

    // 释放内存
    free(s.str);

    return 0;
}

内存管理要点

  1. 动态内存分配:使用malloc等函数为结构体中的动态成员分配内存,并检查返回值是否为NULL,以确保分配成功。
  2. 内存释放:在使用完动态分配的内存后,必须使用free函数释放它,避免内存泄漏。在modifyStruct函数中,先释放旧的内存,再分配新的内存。
  3. 内存泄漏检测:在开发过程中,可以使用工具(如Valgrind)来检测内存泄漏,及时发现并修复问题。
  4. 正确的字符串处理:使用strcpy等函数时,要确保目标缓冲区有足够的空间容纳源字符串,避免缓冲区溢出。这里在分配内存时考虑了字符串长度并加上终止符'\0'的空间。