动态长度的字符数组

Character Array of dynamic length

本文关键字:字符 数组 动态      更新时间:2023-10-16

我写了一个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;
}

我想存在某种内存访问违规。

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

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

在 c++ 中,通过algorithmstd::reverse可以更轻松、更不容易出错地解决此问题。它也更容易使用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;
}

你的代码不是 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++ 代码中使用这种风格