【问题标题】:How to display the value to which a pointer referred? [duplicate]如何显示指针所指的值? [复制]
【发布时间】:2019-03-30 06:42:27
【问题描述】:

显示本地函数中引用的指针的值对我来说很有意义,在主函数中调用此本地函数,指针所引用的值发生了变化。

#include<stdio.h>

char *getAnotherString(){

    char target[] = "Hi, ComplicatedPhenomenon";
    char *ptrToTarget = target;

    printf("ptrToTarget                 = %p\n", ptrToTarget);
    printf("ptrToTarget                 = %s\n", ptrToTarget);
    return ptrToTarget;

}

int main(){
    char *ptrToTarget = NULL;
    ptrToTarget = getAnotherString();
    printf("ptrToTarget                 = %p\n", ptrToTarget);
    printf("ptrToTarget                 = %s\n", ptrToTarget);

    return 0;
}

我希望输出像

ptrToTarget                 = 0x7ffeeed1c950
ptrToTarget                 = Hi, ComplicatedPhenomenon
ptrToTarget                 = 0x7ffeeed1c950
ptrToTarget                 = Hi, ComplicatedPhenomenon

实际输出是

ptrToTarget                 = 0x7ffeeed1c950
ptrToTarget                 = Hi, ComplicatedPhenomenon
ptrToTarget                 = 0x7ffeeed1c950
ptrToTarget                 = Hi, ComplicatedP

【问题讨论】:

    标签: c pointers


    【解决方案1】:
    char target[] = "Hi, ComplicatedPhenomenon";
    

    是一个本地字符数组。这意味着一旦功能结束,它就会失效,您以后不应该使用它。这样做会调用未定义的行为,这意味着输出可以是任何东西。

    您可以通过使用malloc 或使用static 数组动态分配内存来修复它。

    【讨论】:

      【解决方案2】:

      我对 c 语言没有太多经验,但我认为这是关于内存范围的。 用 char[] 分配的变量存储在堆栈中。 (我只是快速搜索了一下,它实际上似乎依赖于编译器) 所以函数返回后,指针没有实际值。

      但是如果你像这样将 ptrToTarget 定义为 char *, 字符 * ptrToTarget = "..."; 这会按您的预期工作。

      【讨论】:

      • 是的,当我像thischar *ptrToTarget = "Hi, ComplicatedPhenomenon";这样直接初始化指针时,它就像你说的那样工作,但是为什么这个函数返回一个具有真实值的指针,不应该Hi, ComplicatedPhenomenon在函数返回时也被破坏
      • 函数返回的指针中真正的内容只是一个垃圾值。当函数返回时它已被销毁,因为它存储在堆栈中。同时,如果您声明 char* str="...";然后 str 存储在全局范围内,例如文本区域或其他内容。
      猜你喜欢
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 2019-07-25
      相关资源
      最近更新 更多