我正在尝试打印从用户读取到程序中的字符串。
我需要能够使用指针打印字符串。
这是我代码的简化版本。
#include <stdio.h>
int main(void)
{
char string[100];
printf("Enter a string: ");
scanf("%s", string);
char *pstring = &string;
printf("The value of the pointer is: %s", *pstring);
return 0;
}
但是我遇到了分段错误
有人可以解释为什么会发生这种情况吗?
您通常不会获取数组的地址,它要么是&string[0]
的,要么只是string
。 在%s
的printf()
中,您应该传递char
指针而不是char
(这就是*pstring
)。 最好在printf()
格式字符串中添加换行符,因为scanf()
不会传递该换行符:
#include <stdio.h>
int main(void) {
char string[100];
printf("Enter a string: ");
scanf("%99s", string);
char *pstring = string;
printf("The value of the pointer is: %sn", pstring);
return 0;
}
string
是一个指针。一个不变的。
值得了解什么是数组(与指针相比)。
特别是它们之间的区别:
char *str1=malloc(6);
strcpy(str1, "hello")
char str2[6];
strcpy(str2, "hello");
在此示例中,str1
和str2
都是指针。 但是str1
是一个变量(如"int x":x的值存储在内存中,您可以对其进行修改)。而str2
则不是。它是一个常数,就像12
.它看起来像一个变量,因为它是一个标识符(str2
),但它不是。编译后,内存中没有地方存储 str2 值。编译器在编译时计算其值,在生成的机器代码中,该值直接插入到代码中。与"12"完全一样。
所以str2=malloc(6)
例如,str2=whatever
是没有意义的。无非是打12=6
或12=whatever
。它不是一个变量。它是一个常量值。
同样,&str2
也没有意义。不比&12
多。它将询问存储常量的地址。但是常量不会存储在任何地方。它是直接在代码中的值。
即 str2 是一个地址的常量值,编译器在其中为6个字节提供了足够的空间。所以你可以把东西存储在str2[0], str2[1], ..., str2[5]中,但不能存储在str2本身中(同样,它是一个常量值,而不是一个变量。你不能在其中存储东西,就像你不能在12
中存储东西一样
)str1 是一个变量,声明为char *
型。您可以在其中存储char *
类型的值(即指向 char 的指针,即存储 char 的内存地址)。该声明会影响此变量的默认(初始)值,该值是 6 个字节的地址,包含字母"h"、"e"、"l"、"l"、"o"和终端 0。
因此,您可以轻松更改 str1,并将所需的任何指针存储在 str1 中。例如,编写str1=str2
。
所以,长话短说:两者都是指针。 str2 是一个常量指针,但仍然是一个指针。两者都是内存中存储字符串的第一个、第二个等字符的位置的地址。
因此,在您的情况下,只需输入
char *pstring=string
或直接使用string
。 或者,出于美学目的,为了澄清您的意思是"字符串第一个字符的地址",您可以键入
char *pstring = &(string[0])
这与"字符串"完全相同(在 C 中,语法a[b]
只是*(a+b)
的快捷方式,所以&(string[0])
是&(*(string+0))
,这是&*string
哪个是string
(另一个奇怪的后果是,你也可以说
char *pstring = &(0[string])
同样,这只是意味着&(*(0+string))
请注意,我不建议那些奇怪的写作。但它有助于理解指针是如何只是值的,你可以将其存储在变量中(如 str1)或直接用作代码中的常量(如 str2)。它只是不如整数(x
声明为int x=12;
的变量与12
常量)那么明显,因为在数组(常量指针)的情况下,这些值由编译器命名,并在代码中采用标识符的具体外观。