C 有人能复习一下这个练习吗?我是对的,但我想澄清几件事

C 有人能复习一下这个练习吗?我是对的,但我想澄清几件事,c,pointers,memory,sample,strcpy,C,Pointers,Memory,Sample,Strcpy,程序应该打印什么? A)世界你好 B) ello_世界 C) 世界杯 D) lo_world E) 非法内存访问,未定义的行为 我的解剖,一行一行。请校对,我几周前刚开始学习C,指针/内存管理开始在我的大脑中“点击”了 声明一个名为“myfunc”的void类型函数,该函数有1个参数:ptr到ptr到char数组“param” 定义“myfunc”:返回带前缀增量的参数“param” 为字符数组“字符串”定义ptr,为“字符串”ptr分配64字节的内存 将字符串“hello_World”指定给“

程序应该打印什么?
A)世界你好
B) ello_世界
C) 世界杯
D) lo_world
E) 非法内存访问,未定义的行为

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

  • 声明一个名为“myfunc”的void类型函数,该函数有1个参数:ptr到ptr到char数组“param”
  • 定义“myfunc”:返回带前缀增量的参数“param”
  • 为字符数组“字符串”定义ptr,为“字符串”ptr分配64字节的内存
  • 将字符串“hello_World”指定给“string”
  • 调用“myfunc”,将“string”的地址作为参数传递,该参数将地址递增/上移1字节(?)
  • 与第4行相同,现在地址相隔两个字节
  • 答案-这是一个诡计的问题;虽然“string”的地址被操纵,但printf函数被传递的是一个实际的字符串,而不是指针。 因此,输出很简单:hello_World
  • 现在,有几个问题。如何更改此代码,使b)、c)、d)甚至e)成为正确答案?另外,他们所说的内存泄漏是否是由于空字符后面有2个“未缠绕”字节的内存,因为指针在2个字节上移位?如果不是,它们是什么意思?

    函数

    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;
    }
    
    不会做你期望的事情。它在本地修改
    参数
    ,对调用函数中的
    字符串
    的值没有影响。您需要使用:

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

    如果您想更改
    string
    main

    中指向的内容,并且由于调用了malloc(64),但从未释放,因此存在内存泄漏。

    一个C测试,用于强制转换
    malloc
    的返回值?嗯,请校对一下好吗?真的吗?让我换个说法。“请原谅我的语法错误,因为我刚刚开始,如果你能很好地指出他们,这将是非常有帮助的。”:和Cody,问答的制造商以前推荐的C++编译器,所以,也许他们只是为了避免隐式施放而倾向于安全的一面?我知道,但他问为什么这个练习说要忽略内存泄漏。谢谢。因此,如果我想释放内存,我可以释放行(字符串);评论在哪里?
    void myfunc(char** param){
      ++(*param);
    }