首页 文章

有人可以复习这个练习吗?我是对的,但想澄清一些事情

提问于
浏览
0
1    void myfunc(char** param){
2       ++param;
}

int main(){
3    char* string = (char*)malloc(64);
4    strcpy(string, "hello_World");
5    myfunc(&string);
6    myfunc(&string);
7    printf("%s\n", string);
    // ignore memory leak for sake of quiz
8    return 0;
}

该程序应该打印什么?
A) hello_world
B)ello_world
C)llo_world
D)lo_world
E)非法内存访问,未定义的行为

我的解剖,一行一行 . 请校对,几周前我刚开始学习C,指针/内存管理开始在我的大脑中“点击”!

  • 声明一个名为'myfunc'的类型为void的函数,带有1个参数:ptr到ptr到char数组'param'

  • 定义'myfunc':使用前缀增量返回参数'param'

  • 将ptr定义为字符数组'string',将64字节内存分配给'string' ptr

  • 将字符串"hello_World"分配给'string'

  • 调用'myfunc',将'string'的地址作为参数传递,该地址将地址递增/移位1字节(?) .

  • 与第4行相同,现在地址距离两个字节

  • ANSWER- It 's a trick question; although the address of ' string'被操纵,printf函数传递了一个实际的字符串,而不是一个指针 . 因此,输出只是:hello_World

现在,有几个问题 . 如何更改此代码以使b),c),d),甚至e)成为正确的答案?另外,由于在空字符之后存在2个“不同步”的内存字节,因为指针移位超过2个字节,所以它们正在讨论内存泄漏吗?如果没有,他们是什么意思?

2 回答

  • 2

    功能

    void myfunc(char** param){
      ++param;
    }
    

    不符合你的期望 . 它在本地修改 param ,对调用函数中 &string 的值没有影响 . 你需要使用:

    void myfunc(char** param){
      ++(*param);
    }
    

    如果你想改变 string 指向 main 的内容 .

  • 5

    并且存在内存泄漏,因为malloc(64)被调用但从未被释放 .

相关问题