GCC-如何正确格式化此字符串?分段错误

GCC-如何正确格式化此字符串?分段错误,c,arrays,pointers,gcc,segmentation-fault,C,Arrays,Pointers,Gcc,Segmentation Fault,我在尝试用C打印字符数组时遇到了一个分段错误 #include <stdio.h> void printLoop(char args[]) { char* p; for (*p = *args; *p != '\0'; p++) { printf("%s", p); } getchar(); } int main() { char *text = "Test"; printLoop(text); } 我已经读到,这与我为数组分配了大量空间有

我在尝试用C打印字符数组时遇到了一个分段错误

#include <stdio.h>

void printLoop(char args[])
{
  char* p;
  for (*p = *args; *p != '\0'; p++)
  {
    printf("%s", p);
  }
  getchar();
} 

int main()
{
  char *text = "Test";
  printLoop(text);
}

我已经读到,这与我为数组分配了大量空间有关,但我真的不明白为什么会这样。

当您编写
*p=*args
时,您将
args
指向的字符的值分配给
p
的值,但您没有分配
p
,所以你不能取消对它的引用

你需要改变

for (*p = *args; *p != '\0'; p++)
printf("%s", p);

将指针
args
分配给指针
p

这样做之后,如果您只想打印
“Test”
,那么就不能在循环的每个迭代中一直打印
p
指向的整个字符串

你需要改变

for (*p = *args; *p != '\0'; p++)
printf("%s", p);

甚至

putchar(*p);

由于在编写
*p=*args
时,您希望打印
p
指向的字符,而不是
p

指向的字符串,因此您将
args
指向的字符的值指定给
p
的值,但您尚未指定
p
,因此无法取消引用它

你需要改变

for (*p = *args; *p != '\0'; p++)
printf("%s", p);

将指针
args
分配给指针
p

这样做之后,如果您只想打印
“Test”
,那么就不能在循环的每个迭代中一直打印
p
指向的整个字符串

你需要改变

for (*p = *args; *p != '\0'; p++)
printf("%s", p);

甚至

putchar(*p);

因为您希望在分配
char*p=args后打印
p
指向的字符,而不是
p
指向的字符串,循环为

while(*p != '\0') 

和更改
printf(“%s”,*p)
printf(“%c”,*p)
,因为您正在通过
char
打印它。 不用说,如果在
while
循环中使用,则在循环中增加
p

您使用的是一次打印字符串的
%s
,因此在第一次迭代时它打印
Test
,然后
p
递增,它打印
est
,依此类推。。
您需要打印一个由
p
指向的
char
,一次打印一个
char

赋值后字符*p=args,循环为

while(*p != '\0') 

和更改
printf(“%s”,*p)
printf(“%c”,*p)
,因为您正在通过
char
打印它。 不用说,如果在
while
循环中使用,则在循环中增加
p

您使用的是一次打印字符串的
%s
,因此在第一次迭代时它打印
Test
,然后
p
递增,它打印
est
,依此类推。。
您需要打印一个由
p
指向的
char
,一次打印一个
char

printLoop
中的
for
更改为
for(p=args;*p!='\0';p++)
。祝你好运。嘿,谢谢。我在另一篇文章中找到了答案,但现在我收到了一个格式错误。它打印的是“testestt”,而不仅仅是“Test”。你知道为什么吗?你会得到“testestt”,因为你打印的是以p开头的字符串,而不是p指向的字符。因此,打印“Test”,然后是“est”,然后是“st”,然后是“t”。将
printLoop
中的
更改为
(p=args;*p!='\0';p++)
。祝你好运。嘿,谢谢。我在另一篇文章中找到了答案,但现在我收到了一个格式错误。它打印的是“testestt”,而不仅仅是“Test”。你知道为什么吗?你会得到“testestt”,因为你打印的是以p开头的字符串,而不是p指向的字符。所以你打印“Test”,然后是“est”,然后是“st”,然后是“t”。