初始化从指针生成整数而没有强制转换[默认启用]

时间:2014-05-04 19:11:00

标签: c

我刚开始学习如何编程,我遇到了这样的错误:"初始化从指针生成整数而没有强制转换[默认启用]" 有什么问题?

 // This program pairs three kids with their favorite superhero
#include <stdio.h>
#include <string.h>
main()
{
char Kid1[12];
// Kid1 can hold an 11-character name
// Kid2 will be 7 characters (Maddie plus null 0)
char Kid2[] = "Maddie";
// Kid3 is also 7 characters, but specifically defined
char Kid3[7] = "Andrew";
// Hero1 will be 7 characters (adding null 0!)
char Hero1 = "Batman";
// Hero2 will have extra room just in case
char Hero2[34] = "Spiderman";
char Hero3[25];
Kid1[0] = 'K';  //Kid1 is being defined character-by-character
Kid1[1] = 'a';  //Not efficient, but it does work
Kid1[2] = 't';
Kid1[3] = 'i';
Kid1[4] = 'e';
Kid1[5] = '\0';  // Never forget the null 0 so C knows when the
// string ends
strcpy(Hero3, "The Incredible Hulk");


printf("%s\'s favorite hero is %s.\n", Kid1, Hero1);
printf("%s\'s favorite hero is %s.\n", Kid2, Hero2);
printf("%s\'s favorite hero is %s.\n", Kid3, Hero3);
return 0;
}

4 个答案:

答案 0 :(得分:2)

char Hero1 = "Batman";

应该是

char Hero1[] = "Batman";

答案 1 :(得分:0)

问题在于char Hero1 = "Batman"

  • 当您在代码中使用双引号字符串时,编译器会将其替换为指向字符串将在运行时驻留的内存空间开头的指针。
  • 因此,char Hero1 = "Batman"实际上是在尝试将一个内存地址(通常由32或64位数据组成,具体取决于您的系统)分配给一个字符变量(通常存储8位数据)

要解决此问题,您需要将其更改为以下任一选项之一:

  • char Hero1[] = "Batman"
  • char* Hero1 = "Batman"

仅供参考,在上述两种情况下,字符串"Batman"将在运行时驻留在只读内存部分。

然而,这两种情况之间存在显着差异:

  • 使用char Hero1[],每次调用函数时,"Batman"字符串都将被复制到堆栈中。 Hero1数组将从该地址开始,您将能够在函数中稍后更改该数组的内容。
  • 每次调用函数时,使用char* Hero1"Batman"字符串将复制到堆栈中。 Hero1变量将指向字符串的原始地址,因此将能够在函数内的任何位置更改该字符串的内容。

当从代码生成可执行映像时,字符串放置在代码段中,这是程序中的几个内存段之一。然后编译器用所谓的“整数赋值”替换所谓的“字符串赋值”。

例如,char* x = "abc"在编译为目标代码之前更改为char* x = (char*)0x82004000,其中0x82004000是程序内存空间中字符串的(常量)地址。

执行sizeof("abc")时,可执行图像甚至不包含 "abc"字符串,因为没有对此字符串执行“运行时”操作。

没有为sizeof生成目标代码 - 编译器在编译期间计算此值 ,并立即用常量替换

您可以查看通常生成的(中间)地图文件,并查看该sizeof操作的输入字符串不会出现在任何地方。

答案 2 :(得分:0)

有几次你有一些问题:

#include <stdio.h>
#include <string.h>
main()
{
    char Kid1[12];
    // Kid1 can hold an 11-character name
    // Kid2 will be 7 characters (Maddie plus null 0)
    char Kid2[] = "Maddie";
    // Kid3 is also 7 characters, but specifically defined
    char Kid3[7] = "Andrew";
    // Hero1 will be 7 characters (adding null 0!)
    char *Hero1 = "Batman"; //needs to be a pointer
    // Hero2 will have extra room just in case
    char *Hero2 = "Spiderman"; //needs to be a pointer
    char Hero3[25]
    Kid1[0] = 'K';  //Kid1 is being defined character-by-character
    Kid1[1] = 'a';  //Not efficient, but it does work
    Kid1[2] = 't';
    Kid1[3] = 'i';
    Kid1[4] = 'e';
    Kid1[5] = '\0';  // Never forget the null 0 so C knows when the
                  // string ends
    strcpy(Hero3, "The Incredible Hulk");


    printf("%s\'s favorite hero is %s.\n", Kid1, Hero1);
    printf("%s\'s favorite hero is %s.\n", Kid2, Hero2);
    printf("%s\'s favorite hero is %s.\n", Kid3, Hero3);
    return 0;
}

你应该在函数的顶部定义你的所有变量,这是一个很好的C练习。

除此之外,我用评论标记了问题(并纠正了它们)。

答案 3 :(得分:0)

解决方案:

出现此错误是因为字符串数据类型不在 C 中 编程您可以使用数组或字符指针打印字符串,例如

1.数组

Save

Click here to check the output of solution array

2.字符指针

  #include<stdio.h>
   int main(){
   char  a[]={'a','b','c','d','f','\0'};
   printf("%s",a);
   return 0;
   }

Click here to check the output of solution char pointer