我最近才开始学习C.当我遇到一个绊脚石时,我正在经历数组和指针的概念。
考虑这段代码 -
#include<stdio.h>
int main()
{
char string[]="Hello";
char *ptr;
ptr=string;
puts(*ptr);
return(0);
}
它编译,但在执行时遇到分段错误。
我得到的警告是:
将参数1中的错误输入到“puts”;发现'char'期望'指向char的指针'
现在* ptr会返回一个字符“H”,我最初的印象是它只接受一个字符作为输入。
后来,我开始明白puts()需要一个指向字符数组的指针作为它的输入,但我的问题是当我传递这样的东西时 - puts(“H”),不是同一个东西puts(* ptr),假设* ptr确实包含字符“H”。
答案 0 :(得分:3)
"H"
是一个字符串文字,由2个字节'H'
和'\0'
组成。每当代码中有“H”时,就会指向一个指向2字节内存区域的指针。 *ptr
只返回一个char
变量。
答案 1 :(得分:2)
通过执行puts(*str)
,您取消引用str
变量。然后,这将尝试使用'H'字符作为内存地址(因为这是str
)指向的内容,然后是segfault,因为它将是一个无效指针(因为它可能会落在进程的内存之外)。这是因为puts
函数接受指针作为参数。
你真正想要的是puts(str)
。
顺便说一句,后一个例子puts("h")
在编译时用“h”填充字符串表,并用隐式指针替换那里的定义。
答案 2 :(得分:2)
puts()函数接受一个指向字符串的指针,你正在做的是指定一个字符。
看看这个Lesson 9: C Strings。
所以而不是做
#include<stdio.h>
int main()
{
char string[]="Hello";
char *ptr;
ptr=string; // store address of first character of the char array into char pointer variable ptr
// ptr=string is same as ptr=&string[0] since string is an array and an
// array variable name is treated like a constant pointer to the first
// element of the array in C.
puts(*ptr); // get character pointed to by pointer ptr and pass to function puts
// *ptr is the same as ptr[0] or string[0] since ptr = &string[0].
return(0);
}
你应该做
#include<stdio.h>
int main()
{
char string[]="Hello";
char *ptr;
ptr=string; // store address of first character of the char array into char pointer variable ptr
puts(ptr); // pass pointer to the string rather than first character of string.
return(0);
}
答案 3 :(得分:1)
当你输入字符串获取或想要使用put显示它时你必须实际传递指针或字符串的位置
例如
char name[] = "Something";
如果你想打印
你必须写printf("%s",name); --> name actually stores the address of the string "something"
并使用puts,如果要显示
puts(name) ----> same as here address is put in the arguments
答案 4 :(得分:0)
没有
'H'是字符文字。
“H”实际上是一个包含两个元素的字符数组,即'H'和终止'\ 0'空字节。
答案 5 :(得分:0)
puts
正在等待输入一个字符串指针,所以它正在等待一个内存地址。但在您的示例中,您提供了内存*ptr
的内容。 *ptr
是地址为ptr
的内存h
ptr
是内存地址
*ptr
是此内存的内容
puts的输入参数是地址类型,但您提供了char
类型(地址内容)
puts
按照您输入的地址开头的字符开始打印字符,直到包含0
的内存然后停止打印