【问题标题】:Getting a segmentation fault 11 for swap function获取交换功能的分段错误 11
【发布时间】:2017-03-01 01:17:34
【问题描述】:

我正在创建一个带有指针的交换(在我的实际程序中实现它之前使用 couts 对其进行测试)函数,我不完全确定为什么我在运行它时会遇到这个分段错误。有什么想法吗?

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

char * initializeWord(int length);
void swap(char *a, char *b);
//void scrambleWord(char *word, int size);

int main()
{
    int length;
    char *word, *x, *y;
    cout << endl << "Welcome to Word Scrambler!" << endl << endl;
    cout << "How many letters will your word have?" << endl << endl;
    cin >> length;
    getchar();
    cout << endl << "Please input a word that contains " << length << " many characters." << endl << endl;
    word = initializeWord(length);
    cout << endl;
    cout << "The word you entered was: " << word << endl << endl;
    swap(x,y);

    delete[] word;
    return 0;
}

char * initializeWord(int length)
{
    //initialization of char array
    char *cArray = new char[length];
    //user's word
    cin >> cArray;
    getchar();

    return cArray;
    delete[] cArray;
}

void swap(char *a, char *b) 
{
    cout << "First values:" << endl << a << endl << b << endl;
    char *temp = a;
    a = b;
    b = temp;
    cout << "Second values:" << endl << a << endl << b << endl;
}

【问题讨论】:

  • 你永远不会将xy 设置为任何东西......
  • 不要用 C++ 编写 C 代码。使用参考和std::vector
  • 在你return之后你不能delete;回来后什么都做不了
  • char *cArray = new char[length]; 这个语句在 C++ 中是非法的,你不能用非常量变量定义数组的大小
  • @OnurA.,动态分配数组的大小可以在运行时决定。您正在考虑自动数组,但事实并非如此。请看this

标签: c++ pointers memory-management


【解决方案1】:

cin >> cArray; 此行将用户输入设置为数组的地址。

你可能想要:

char* initializeWord(int length)
{
   char* cArray = new char[length];

   for(int i = 0; i < length; ++i)
   {
        cin >> cArray[i]
   }
   ...
}

或者只使用字符串。

【讨论】:

  • 这是我现在想要做的,如果以后出现问题我会改变它。但是,我现在要做的就是测试我的交换功能是否正常工作(它不能正常工作)。我尝试将 *x 和 *y 设置为字符 'x' 和 'y' 但这也不起作用......有点卡住了
  • @Parker 你的意思是告诉我你希望你的用户输入一个有效的地址?我认为您希望他们输入一个单词。您正在写入保存数组地址的变量,而不是数组本身。
  • 嗯,你说得对,我不想这样做,但是当我运行它时,那部分正在工作。目标是获取输入的单词并将该单词中的每个字符放入数组中。
  • 好的,这也可以。很确定这是我应该首先尝试的。我必须实现另外两个功能(不是在寻找答案),但是如果要稍后使用,我是否过早删除 cArray?
  • 实际上,您根本没有删除 cArray。您将在此之前返回并提前结束函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-07
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多