0

Here, I am basically trying to input a string, break it into individual words and assign each word to a char pointer ptr[i].On executing the following code, if I input string of more than one word, it shows

Segmentation fault (core dumped).

I used gdb for debugging. But after I visit while loop 2nd time, it showed

Program received signal SIGSEGV, Segmentation fault. 0x0000003b64a81321 in __strlen_sse2 () from /lib64/libc.so.6

The solution for it is to allocate memory to each ptr[i] before strcpy(ptr[i],cp); using

ptr[i]=new char[sizeof(cp)];.

But, how is it that no memory allocation needed for ptr[0]? If I don't allocate memory to ptr[0], are there any chances of something else being overwritten? I am asking it out of curiosity, I know its always better to allocate memory.
Here is the code:

#include<iostream>
#include<cstring>
#include<string>
using namespace std;

int main()
{   
    int i,j;
    string s1;
    getline(cin,s1);
    char s[100],*ptr[10];
    strcpy(s,s1.c_str());
    char *cp;

    cout<<"string is:  "<<s1<<endl;
    cp=strtok(s," ");
    i=0;
    while(cp!=NULL)
    { cout<<cp<<endl;
      strcpy(ptr[i],cp);
      cp=strtok(NULL," ");
      i++;
    }

    for(j=0;j<i;j++)
    { cout<<ptr[j]<<endl;
    }
    return 0;
}
4

4 回答 4

4

当你声明一个局部变量时,它的内容是undefined。因此,当您声明一个指针数组时,数组中的指针将指向看似随机的位置。使用未初始化的指针是未定义的行为。未定义的行为可能会导致崩溃,或者它可能看似有效,但你不能事先说会发生什么。

您的问题有两种解决方案:

  1. ptr[i]为(即使i为零)分配内存。
  2. 而是将指针分配cp给。ptr[i]

在 C++ 中,在空间上拆分字符串比您所拥有的要简单得多,例如,请参见以下简单程序:

#include <iostream>
#include <vector>
#include <sstream>
#include <algorithm>

int main()
{
    // Put a string into a string stream
    std::istringstream is("hello world how are you today");

    // Vector where to store the "words"
    std::vector<std::string> words;

    // Now split the string on space    
    std::copy(std::istream_iterator<std::string>(is),
              std::istream_iterator<std::string>(),
              std::back_inserter(words));

    // And finally print the words
    for (const auto& word : words)
        std::cout << word << '\n';
}

输出是:

你好
世界
如何
是
你
今天

以下是使用的函数/类的参考列表:

于 2013-08-14T10:37:34.790 回答
2

当您尝试访问不允许程序访问的那部分内存时,就会发生分段错误。当你这样做

字符 *p[10];

它定义了一个包含 10 个指针的数组。数组的内容未知。因此它可能是您程序之外的内存位置。可能第 0 个索引有一些值是程序地址空间的一部分,因此它没有抱怨。第二个索引有一些不属于您的地址空间的东西。

因此,行为是未定义的。这完全取决于数组的内容

于 2013-08-14T10:43:49.027 回答
0

实际上由于线路发生分段错误:

strcpy(ptr[i],cp);

如果您ptr[i]使用newor分配一些内存malloc然后复制它不应该sump。

于 2013-08-23T06:20:56.883 回答
0

有时我们在使用 ptr[0] 时可能不会遇到分段错误,但情况并非总是如此。在将任何值分配给它所指向的对象之前,最好先为指针分配内存。

于 2013-08-23T05:41:14.140 回答