printf("ENTER NAME1\n");
scanf("%s",&n1.p);
printf("\nENTER NAME2\n");
scanf("%s",&n2.p);
您要将带有名称的字符串存储到哪里?
进入各自结构本身内部的指针p的对象?
这是无效和非法的。指针可以指向任何地方,而不是被赋予它们指向自己的对象的值。
因此回答你的问题:
"结构中的指针在下面的代码中是如何工作的?"
它们根本不起作用。你的代码是一团乱七八糟的undefined behavior。
你需要先分配内存,p 指向的地方,f.e.通过使用malloc():
n1.p = malloc(sizeof(char) * 20); // Allocates memory for a string up to 19 characters.
if (!n1.p)
{
fputs("Error at allocation!", stderr);
return EXIT_FAILURE;
}
n2.p = malloc(sizeof(char) * 20); // Allocates memory for a string up to 19 characters.
if (!n2.p)
{
fputs("Error at allocation!", stderr);
return EXIT_FAILURE;
}
然后将参数正确地传递给scanf():
printf("ENTER NAME1\n");
scanf("%s", n1.p);
printf("\nENTER NAME2\n");
scanf("%s", n2.p);
(注意n1.p 而不是&n1.p。n2.p 也是如此)
或者更好:
printf("ENTER NAME1\n");
if (scanf("%s", n1.p) != 1)
{
fputs("Error at input!", stderr);
return EXIT_FAILURE;
}
printf("\nENTER NAME2\n");
if (scanf("%s", n2.p) != 1)
{
fputs("Error at input!", stderr);
return EXIT_FAILURE;
}
确保输入错误时的安全。
此外,%s 转换说明符需要 char * 类型的参数,而不是像 &n1.p 和 &n2.p 那样指向 char * (char **) 的指针。
提供错误类型的参数也会调用undefined behavior。
只需使用n1.p 和n2.p。
这个printf() 调用也是错误的:
printf("ENTERED NAMES ARE %s , %s", &n1.p,&n2.p);
您也需要省略&:
printf("ENTERED NAMES ARE %s , %s", n1.p, n2.p);
一体化:
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
struct name
{
char *p;
} n1, n2;
n1.p = malloc(sizeof(char) * 20); // Allocates memory for a string up to 19 characters.
if (!n1.p)
{
fputs("Error at allocation!", stderr);
return EXIT_FAILURE;
}
n2.p = malloc(sizeof(char) * 20); // Allocates memory for a string up to 19 characters.
if (!n2.p)
{
fputs("Error at allocation!", stderr);
return EXIT_FAILURE;
}
printf("ENTER NAME1\n");
if (scanf("%s", n1.p) != 1)
{
fputs("Error at input!", stderr);
return EXIT_FAILUE;
}
printf("ENTER NAME2\n");
if (scanf("%s", n2.p) != 1)
{
fputs("Error at input!", stderr);
return EXIT_FAILURE;
}
printf("ENTERED NAMES ARE %s , %s", n1.p, n2.p);
free(n1.p):
free(n2.p);
return 0;
}
执行:
ENTER NAME1
Peter
ENTER NAME2
Maria
ENTERED NAMES ARE Peter , Maria