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

时间:2014-06-18 04:37:42

标签: c pointers memory sample strcpy

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,指针/内存管理开始了#34;点击"在我的大脑里!

  1. 声明一个名为void的函数,名为' myfunc'带有1个参数:ptr到ptr到char数组' param'
  2. 定义' myfunc':返回参数' param'带有前缀增量
  3. 将ptr定义为字符数组' string',将64字节的内存分配给'字符串' PTR
  4. 分配字符串" hello_World"到'字符串'
  5. 来电' myfunc',传递'字符串'的地址作为参数,它将地址递增/移位1字节(?)。
  6. 与第4行相同,现在地址距离两个字节
  7. 答案 - 这是一个棘手的问题;虽然'字符串'的地址被操纵,printf函数传递一个实际的字符串,而不是指针。     因此,输出只是:hello_World
  8. 现在,有几个问题。如何更改此代码以使b),c),d),甚至e)成为正确的答案?此外,他们正在谈论的内存泄漏是由于存在2"不同意"空字符后的内存字节,因为指针移位超过2个字节?如果不是,那是什么意思?

2 个答案:

答案 0 :(得分:5)

功能

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

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

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

如果您想更改stringmain指向的内容。

答案 1 :(得分:2)

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