字符数组的动态长度

时间:2017-08-27 08:17:02

标签: c++ pointers nullpointerexception char

我编写了一个C ++函数,可以表示如下: 它只需要一个字符串(这是崩溃的地方)并将其反转。

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int main()
{
 cout<<"Enter a string: "<<endl;
 char *str;
 gets(str);
 cout<<"Reversed String is: ";
 for(int i=strlen(str)-1;i>=0;i--)
    cout<<(str[i]);
 return 0;
}

我猜有某种内存访问违规行为。

任何线索为什么这不起作用?

错误:分段错误(核心转储)

2 个答案:

答案 0 :(得分:2)

中,通过std::reverse中的algorithm,可以更轻松,更不容易出错解决此问题。它也更容易使用std::string

#include <iostream>
#include <algorithm>

int main ()
{
  std::string input;
  std::cout << "Enter string to reverse: ";
  std::cin >> input;
  std::reverse(input.begin(),input.end());
  std::cout << "Reversed string: " << input << std::endl;
  return 0;
}

如果你必须通过char数组来做,试试这个(你甚至不需要动态内存分配)

#include <iostream>
#include <algorithm>
#include <cstring>

int main ()
{
  char input[1024];
  puts("Enter string to reverse: ");
  fgets(input, 1024, stdin);
  std::reverse(input, input + strlen(input));
  printf("Reversed string: %s", input);
  return 0;
}

答案 1 :(得分:2)

您的代码不是c ++风格,我建议您查看Filip(https://stackoverflow.com/a/45903067/4386427)的答案

我只会解决你的代码出了什么问题。

当你这样做时

char* str;

你得到的只是一个可以指向char的指针。持有char没有任何记忆。此外,指针变量str的值未初始化。

所以当你这样做时

strlen(str)

您读取了未初始化的变量,并尝试将此未初始化的值视为C样式字符串。这是未定义的行为,很可能导致程序崩溃。

在使用之前,您需要确保str已初始化。你想要动态内存,你可以这样做:

char *str;
str = new(char[100]);  // Initialize str to point to a dynamic allocated
                       // char array with size 100
...
...
delete(str);

但是再次 - 我不会在c ++代码中使用这种风格