题
我正在努力实现
void strcpyy(char *s, char *t){
while(*s++ = *t++){
}
}
这是K&R的一个例子。实现应该相当容易,但出于某种原因,目前对我来说并非如此。所以我有以下内容
int main(){
char *mess = "hello world";
char *mess = (char *) malloc(strlen(mess) + 1);
char *aess;
strcpyy(aess, mess);
printf("%s", aess);
return 0;
}
每次运行程序时,每次运行程序时,我都会得到一个很大的错误列表 -Wall
.我会认为,实现和使用 strcpyy
, ,你将不得不malloc空间复制字符串,一旦你这样做,你应该能够打印出来 aess
理论上应该包含一份 mess
.任何帮助将不胜感激!
解决方案
始终是一种良好的做法,要注意错误消息,尤其是第一条消息(其他人通常是第一个错误的后果)。错误消息肯定会指示与malloc的线路对应的行号,并且大多数可能告诉你那里的问题是什么。
更正您的程序以阅读:
char *mess = "hello world";
char *aess = (char *) malloc(strlen(mess) + 1);
.
或完整功能是:
int main(){
char *mess = "hello world";
char *aess = (char *) malloc(strlen(mess) + 1);
strcpyy(aess, mess);
printf("%s", aess);
return 0;
}
.
问题是你的行
char *mess = (char *) malloc(strlen(mess) + 1);
.
覆盖第一行
char *mess = "hello world";
.
和行
char *aess;
.
离开变量未分配。
编译错误是因为编译器无法在
之间进行选择char *mess = "hello world";
.
和
char *mess = (char *) malloc(strlen(mess) + 1);
.
引入一个新变量,但具有相同的名称。
其他提示
程序将看出以下方式
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void strcpyy( char *s, const char *t )
{
while ( *s++ = *t++ );
}
int main( void )
{
char *t = "hello world";
char *s = ( char * )malloc( strlen( t ) + 1 );
strcpyy( s, t );
printf( "%s\n", s );
free( s );
return 0;
}
. 更改
char *mess = "hello world";
char *mess = (char *) malloc(strlen(mess) + 1);
char *aess;
.
char *mess = "hello world";
char *aess = malloc(strlen(mess) + 1);
.
mess
是一个字符串文字,它在只读存储器中保持。您正在覆盖它并丢失您想要复制的字符串。您需要为您想要复制字符的位置,为您想要复制某些空间,在您的案例属生成icotagcode变量中。此外,请记住程序结束时的生成扫描码。如果没有,您将获得内存泄漏。
你为什么要声明和定义 mess
两次?永远不要声明两个具有相同名称的变量,如果它们具有相同的范围,通过这样做,您会混淆编译器;我重新使用 strdup
像这样 :
int main(){
char *mess = strdup("hello world");
char *aess;
strcpyy(aess, mess);
printf("%s", aess);
return 0;
}
或者只是一个像这样的普通数组
int main(){
char mess[] = "hello world";
char *aess;
strcpyy(aess, mess);
printf("%s", aess);
return 0;
}
不隶属于 StackOverflow