C ++:每当我尝试运行此char指针函数时,继续得到SIGSEV信号和分段错误

时间:2014-07-13 18:10:49

标签: c++ pointers char

我刚刚开始学习指针,我目前在使用这个函数时遇到了麻烦,我想分析一下,因为它似乎没有为我编译。

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;
}

任何帮助将不胜感激!我已经坚持了一段时间。

编辑: 谢谢大家的帮助!我现在已经解决了这个问题,并了解我做错了什么。

2 个答案:

答案 0 :(得分:2)

问题是你有一个指向单个字符的指针,它本身不是一个字符串。 C中的字符串是一个或多个字符的集合,以零(字符'\0')终止。由于&#34;字符串&#34;你传递给函数没有终止,你的循环将超出指针所指向的数据的末尾,可能相当多。

然后你写入指针,这些指针现在超出了为数据分配的内存,从而导致undefined behavior经常导致崩溃。

要解决这个问题,你应该传入适当长度的数组,这意味着第二个数组必须比第一个数组长。

答案 1 :(得分:2)

问题在于使用mystery3函数:它假定了几件不正确的事情:

  • str1指向终止于'\0' 的字符区域 - 这不是真的:str1指向一个非零字符,没有
  • 之后的零终止
  • str2指向以'\0' 结尾的字符区域 - 与上述相同
  • str1指向足以在str1str2存储字符串的内存区域,以及单个空终结符 - 这不是真的:{ {1}}指向一个角色。

要解决此问题,您需要为连接字符串分配足够的内存(例如,通过使用数组)并使用以null结尾的字符串初始化两个数组。在str1函数中进行此更改:

main

这将产生预期的结果。

Demo on ideone.