我刚刚开始学习指针,我目前在使用这个函数时遇到了麻烦,我想分析一下,因为它似乎没有为我编译。
void mystery3(char *str1, char *str2)
{
while(*str1 != 0)
{
str1++;
}
while(*str2 != 0)
{
*str1 = *str2;
str1++;
str2++;
}
*str1 = *str2;
}
我尝试过不同的方法来实现这个功能,但最后我一直收到错误或空指针。这是我目前使用的驱动程序:
#include <iostream>
using namespace std;
int main()
{
char str, str2;
char *strPtr, *strPtr2;
str = 'a';
strPtr = &str;
str2 = 'b';
strPtr2 = &str2;
cout << (int*)strPtr << " " << (int*)strPtr2 << endl;
cout << strPtr << " " << strPtr2 << endl;
cout << *strPtr << " " << *strPtr2 << endl;
mystery3(strPtr, strPtr2);
cout << (int*)strPtr << " " << (int*)strPtr2 << endl;
cout << strPtr << " " << strPtr2 << endl;
return 0;
}
任何帮助将不胜感激!我已经坚持了一段时间。
编辑: 谢谢大家的帮助!我现在已经解决了这个问题,并了解我做错了什么。
答案 0 :(得分:2)
问题是你有一个指向单个字符的指针,它本身不是一个字符串。 C中的字符串是一个或多个字符的集合,以零(字符'\0'
)终止。由于&#34;字符串&#34;你传递给函数没有终止,你的循环将超出指针所指向的数据的末尾,可能相当多。
然后你写入指针,这些指针现在超出了为数据分配的内存,从而导致undefined behavior经常导致崩溃。
要解决这个问题,你应该传入适当长度的数组,这意味着第二个数组必须比第一个数组长。
答案 1 :(得分:2)
问题在于使用mystery3
函数:它假定了几件不正确的事情:
str1
指向终止于'\0'
的字符区域 - 这不是真的:str1
指向一个非零字符,没有str2
指向以'\0'
结尾的字符区域 - 与上述相同str1
指向足以在str1
和str2
存储字符串的内存区域,以及单个空终结符 - 这不是真的:{ {1}}指向一个角色。要解决此问题,您需要为连接字符串分配足够的内存(例如,通过使用数组)并使用以null结尾的字符串初始化两个数组。在str1
函数中进行此更改:
main
这将产生预期的结果。