传递给Al的函数将函数放入C中

时间:2012-10-05 15:57:01

标签: c puts

我最近才开始学习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”。

6 个答案:

答案 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的内存然后停止打印