【问题标题】:C pointer difference Char Int [duplicate]C指针差异Char Int [重复]
【发布时间】:2016-11-03 12:31:56
【问题描述】:

下面的代码可以根据需要工作。

  void TstPointer(int *Pointer)
    {
        *Pointer = 3;   
    }

    int main()
    {
        int number = 1;
        int *ptr  = &number;

        TstPointer(ptr);

        printf("%d\n", number);
    }

但是当我将类型切换为 char 时它不起作用。

void TstPointer(char *Pointer)
{
    *Pointer = "Hell1"; 
}

int main()
{
    char *Hello  = "Hello";
    TstPointer(Hello);
    printf("%s\n", Hello);
}

警告:赋值从没有强制转换的指针生成整数 [-Wint-conversion] *指针=“地狱1”;

【问题讨论】:

  • 'H' 是一个字符(char),"Hell1" 是一个字符串(char 的数组)
  • 请在您的初级 C 编程书中学习指针和字符串的工作原理。

标签: c pointers


【解决方案1】:

Hello 的引用传递给您的方法 (&Hello),就像使用 int 一样 -

int *ptr = &number; TstPointer(ptr);

【讨论】:

  • void TstPointer(char **Pointer) { *Pointer = "Hello"; } int main() { char *Hello = "Hello World"; TstPointer(&Hello); printf("%s\n", Hello); } 那么我是如何根据你们的回答解决这个问题的!
【解决方案2】:

在执行*Pointer = "Hell1"; 时,您的编译器会警告您。您选择忽略可能调用 undefined behavior 的内容。

一般来说,要复制到指针,请使用strcpy(),但在这种情况下,这会导致问题,因为Pointer 指向一个字符串文字,您不能更改它.

在尝试将内存写入该内存位置之前,您需要确保内存是可写的。要么使用内存分配器函数,要么创建一个数组并使指针指向数组的开头。

【讨论】:

    【解决方案3】:

    在您的TstPointer 方法中,当您执行*Pointer = "Hell1"; 时,您正在生成警告。

    这是因为,如果Pointer 是一个字符指针,那么*Pointer 是一个字符变量。而且您正在将一个字符串常量分配给一个错误的 char 变量。

    为了解决这个问题,我认为你应该在函数参数中使用双指针作为传递main中的(指针的)地址!

    编辑:

    您收到警告是因为当您将字符串常量分配给变量(通常是字符指针或数组)时,该变量存储字符串常量开头的地址。现在,当左值不是 char 指针类型,而只是一个 char 变量时,会发生一些隐式转换以将“地址”分配(拟合)为普通的 char 变量,这反过来会发出警告。但是,我们知道char 无法容纳内存地址,因此打印时通常会导致段错误!

    【讨论】:

    • 那个或strcpy(Pointer,"Hell1");
    • @skrtbhtngr 预期为'char **',但参数类型为'char *' void TstPointer(char **Pointer)
    • 主要是TstPointer(&Hello);
    • @Turtle 使用strcpy() 并不安全,因为它会覆盖main() 中的"Hello"
    • @Turtle 这是我想要做的。覆盖 main() 中的变量
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 2013-06-02
    • 2017-02-12
    相关资源
    最近更新 更多