我在Youtube视频之后学习C语言,并且我有几个问题。
我在Xcode中输入以下内容
#include<stdio.h>
int main() // 1. why do we have to use this line?
{
char food[] = "tuna";
printf("the best food is %s",food);
strcpy(food,"bacon"); // error here
return 0;
}
char*(char*,const char*)
&#39;&#34; 我不知道这是什么意思以及它为什么会发生?很抱歉打扰问题的人,但我需要你的帮助。谢谢
答案 0 :(得分:2)
C是一门非常好的语言,但是由于与python,javascript等相比它的级别有多低。你需要做很多手动任务,包括内存管理。
但在我们开始之前,您的初始问题不包括string.h
标头。一旦包含该标题,您实际上会获得分段错误。
以下是您获取分段错误原因的说明。
所以当你定义:
char food[] = "tuna"
C创建了5个字节的char数组。为什么5?因为所有字符串都以NULL字节结尾('\0'
)。
所以你的内存中的字符串看起来像"tuna\0"
。
旁注:
NULL字节的重要性是表示字符串的结尾。当您使用printf
之类的功能时,这非常重要。因为在打印字符串时,printf
将查找NULL字节以停止打印。
因此,此char数组的最大大小为5个字节,1为空字节,因此只有4个字节(字符)的可写内存。
然后你试着复制&#34;培根&#34;进入你的5字节数组。
所以strcpy尝试复制b,然后是c,然后是o,然后是n,然后当它试图用NULL字节终止字符串时,它会因为你试图访问a而出错您无法访问的内存字节。
因此,为了解决您的问题,您可以尝试strcpy
与原始字符串长度相同或更短的字符串。或者您可以查看strdup
之类的内容并使用指针。
该代码如下所示:
#include <stdio.h>
#include <string.h>
int main()
{
char *food = "tuna";
printf("the best food is %s\n",food);
food = strdup("bacon");
printf("the best food is %s\n",food);
return 0;
}
希望这有帮助!
答案 1 :(得分:0)
main()
,这是执行C程序的函数。strcpy()
(预定义函数),您需要先声明它。它的声明出现在string.h
中,所以只有#include<string.h>
这将解决您的问题。implicit declaring library function 'strcpy' with type
&#39; char *(char *,const char *)``声明
时还有一个问题 char food[]="tuna";
你只为你分配5个字节,4个用于字符,还有一个用于NULL。当您尝试将bacon
放入其中时(使用strcpy()
),这是6个字节长。它会导致编译器创建分段错误。
答案 2 :(得分:0)
我建议你练习解释一下这段代码的行为。您必须了解C语言如何将“字符串”管理到内存中。
我在下面发布的代码不正确,包含违反为变量food
分配的空间。在这种情况下,此代码不会生成分段错误,但它可能会生成这样的错误!
如果使用gcc -Wall --pedantic -std=c99 prgname.c
编译下面的代码,编译器不会发出警告或错误信号,但代码不正确。
注意! :)
#include <stdio.h>
#include <string.h>
int main() // 1. why do we have to use this line?
{ // --- 'cause is a standard!!! :)
char food[] = "tuna";
char b[]="prova";
printf("the best food is %s - %s - food-size %u\n",food,b,(unsigned int)sizeof(food));
strcpy(food,"fried or roasted bacon"); // error here
printf("the best food is %s - %s - food-size %u\n",food,b,(unsigned int)sizeof(food));
return 0;
}
答案 3 :(得分:-1)
除了其他人所说的内容外,请注意strcpy(char * destination, const char * source )
为避免溢出,目标指向的数组大小应足够长,以包含与源相同的C字符串(包括终止空字符),并且不应在内存中与源重叠。
如果您的目的地太小,您可能会遇到segmentation fault。