Can';t声明两个字符指针

Can';t声明两个字符指针,c,string,pointers,C,String,Pointers,可能重复: 我正在尝试这个相当简单的代码: #include<stdio.h> void copy(char *,char *); main() { char *name; char *surname; printf("Enter name: "); scanf("%s",name); printf("%s",name); } #包括 无效副本(字符*,字符*); main(){ 字符*名称; 查*姓; printf(“输入名称:”); scanf(“%s”,名称);

可能重复:

我正在尝试这个相当简单的代码:

#include<stdio.h>
void copy(char *,char *);
main() {
char *name;
char *surname;
printf("Enter name: ");
scanf("%s",name);

printf("%s",name);
}    
#包括
无效副本(字符*,字符*);
main(){
字符*名称;
查*姓;
printf(“输入名称:”);
scanf(“%s”,名称);
printf(“%s”,名称);
}    

但由于某种原因,在我输入名称并按enter键后,程序挂起并给出一条消息,如“程序已停止工作”。但是当我删除第二个字符指针声明时,即
字符*姓氏,它的工作原理与预期一样。这里有什么问题?

您正在写入未分配的内存。这就是未定义的行为

你可以在这里做两件事:

  • 在编译时将字符数组声明为具有固定大小,如下所示:
    charname[100](这意味着您无法在运行时更改其大小)
  • stdlib.h
  • 在任何情况下,您必须确保您只允许用户输入您分配的字节数,否则会发生不好的事情


    如果你不能定义上述边界,一个邪恶的人可以(和将要)做什么的小研究可以在这里找到:

    你没有为指针分配内存,因此指针访问任意未指定的内存,这是未定义的行为

    您需要将指向足够大的内存块的指针传递给scanf,或者

    char s1[100], s2[100];
    
    (如果100足够大)或内存


    因为你没有为它分配内存,而你放进去的字符串会破坏程序的代码。尝试使用和:

    #包括
    int main()
    {
    int n字节=100;
    char*my_字符串;
    int int1、int2、int3;
    int args_赋值;
    args_赋值=0;
    while(分配的参数!=3)
    {
    puts(“请输入三个以空格分隔的整数。”);
    my_string=(char*)malloc(n字节+1);
    getline(&my_string,&nbytes,stdin);
    args_assigned=sscanf(我的_字符串,“%d%d%d”、&int1、&int2和&int3);
    如果(已分配参数!=3)
    puts(“\nInput无效!”);
    }
    printf(“\n银行!\n%d\n%d\n%d\n”,int1、int2、int3);
    返回0;
    }
    
    看看这个:

    这是:


    您声明了一个指针,但没有给它一个有效的内存地址,它指向一个随机的addrss。无法使用此指针进行读取或写入。指针的使用应如下所示:

    char s1[100],s2[100];
    char * name=s1;
    char * surname=s2;
    

    我不明白。那么,如果第二个声明被删除,它为什么会起作用呢。。“未定义的行为”您正在将“某处”写入非结构化内存。。任何事情都可能发生,发生的事情取决于编译器和/或平台。很可能内核意识到您正在非法覆盖您在第一个指针之后声明的指针(这使得您很可能在第二个字符处写入该指针),并阻止您这样做。@Cupidvogel UB并不意味着程序会崩溃,它意味着程序会崩溃。@GungFoo另外,请添加基于堆栈的指针(自动)数组选项添加到您的答案。@H2CO3我做了您要求的编辑并添加了一些有趣的东西:)为什么这些无关的指针?只需将
    s1
    s2
    传递到
    scanf()
    。谢谢。另一个问题,指针,不管它们指向什么,它们本身实际上是存储地址的整数,对吗?所以
    *p=“foo”
    将把一些整数值放入
    p
    ,这将是程序存储foo的地址,对吗?为什么我们可以将字符串分配给
    p
    ,比如
    p=“barbar”
    ?char*p*p=“foo”是错误的。p=“foo”是对的。因为在C语言中,字符串是字符指针。(1)是的,指针实际上是整数,更准确地说,是特殊的整数,其值是内存地址。在某些IDE中,您可以将整数指定给指针
    char*p=10p+=20char*p*p=“foo”是错误的
    p=“foo”
    是正确的。因为在C中,字符串是字符指针。指针应该分配给指针。@H2CO3:只需使用
    s1
    s2
    即可。但问题的作者想知道如何使用指针。所以我必须使用指针作为演示。
    #include <stdio.h>
    
    int main()
    {
      int nbytes = 100;
      char *my_string;
      int int1, int2, int3;
      int args_assigned;
    
      args_assigned = 0;
    
      while (args_assigned != 3)
        {
          puts ("Please enter three integers separated by whitespace.");
          my_string = (char *) malloc (nbytes + 1);
          getline (&my_string, &nbytes, stdin);
          args_assigned = sscanf (my_string, "%d %d %d", &int1, &int2, &int3);
          if (args_assigned != 3)
        puts ("\nInput invalid!");
        }
    
      printf ("\nThanks!\n%d\n%d\n%d\n", int1, int2, int3);
    
      return 0;
    }
    
    char s1[100],s2[100];
    char * name=s1;
    char * surname=s2;