【问题标题】:is it possible to assign string of text to pointer?是否可以将文本字符串分配给指针?
【发布时间】:2021-10-15 06:42:11
【问题描述】:

当我们这样做时:

char *p;
p="Hello stackoverflow";
printf("%s",p);

它会打印 Hello stackoverflow 但是根据我的理解,指针只能保存内存地址而不是文本字符串,为什么我们不应该像 printf("%s",*p); 这样取消引用指针而不是p ? couz only p 的意思是给我们指针保存的内存地址而不是内容!任何解释!谢谢。

【问题讨论】:

  • 您只需要查看printf 的规范。它声明对于%s 格式说明符,它需要一个指向char 的指针,而不是char。如果您提供char,它如何知道在哪里可以找到其他字符?
  • 是的,有可能。如果你取消引用你会得到第一个字符,不适合%s
  • 字符串文字是一个数组。在许多情况下,数组会被转换 (decay) 为指向其第一个元素的指针。这是您分配给p 的转换结果(指向char 的指针),这没关系,因为两者(pconversion from the array)具有相同的类型。

标签: c pointers implicit-conversion string-literals


【解决方案1】:

表达式中使用的数组被隐式转换(极少数例外)为指向其第一个元素的指针。

来自 C 标准(6.3.2.1 左值、数组和函数指示符)

3 除非它是 sizeof 运算符的操作数或一元 & 运算符,或者是用于初始化数组的字符串文字, 具有“类型数组”类型的表达式被转换为 类型为“类型指针”的表达式,指向初始 数组对象的元素并且不是左值。如果数组对象 有注册存储类,行为未定义。

在这段代码中sn-p

char *p;
p="Hello stackoverflow";

字符文字"Hello stackoverflow" 具有数组类型char[20] 并用作初始化器,它被转换为指向其第一个元素的指针。其实写起来也是一样的

p = &"Hello stackoverflow"[0];

至于解引用指针 p,表达式 *p 具有 char 类型但转换说明符 %s 需要 char * 类型的参数。

因此调用

printf("%s",*p);

调用未定义的行为。

【讨论】:

    【解决方案2】:

    您可以使用 char * 并使用该地址,也可以只为 char * 分配内存并使用该地址:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(){
        char a[] = "Hello Stackoverflow!";
        printf("%s\n", &a);
    
        char *b = (char *) malloc(21);
        strcat(b, "Hello Stackoverflow!");
        printf("\n%s", b);
        free(b);
        return 0;
    }
    

    【讨论】:

    • strcat(b, "Hello Stackoverflow!");可能会导致问题,因为“malloc()”不能保证它返回给你的内存块的内容是什么。所以,要么使用“calloc()”,要么在调用“strcat()”之前初始化块。
    【解决方案3】:

    “Hello stackoverflow”实际上存储在内存中。所以 p = "Hello stackoverflow" 会将 p 赋值给 "Hello stackoverflow" 的起始地址

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多