c++ - 将保存数组元素的指针的地址传递给c ++中的函数时出错
问题描述
我创建了一个字符数组,然后将它们分配给一个指针。然后我将该指针地址传递给一个函数,该函数将逐个字符地反转数组并将它们打印出来。我无法理解我的代码中的错误。
// ConsoleApplication1.cpp : This file contains the 'main' function.
// Program execution begins and ends there.
#include <iostream>
#include<conio.h>
using namespace std;
void reverses(char* p) {
int count = 17;
for (int i = 0; i < 18; i++) {
cout << *(p + i);
char temp = *(p + i);
*(p + i) = *(p + count);
*(p + count) = temp;
count--;
cout << *(p + i);
}
}
int main() {
char names[18] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
'j','k','l','m','n','o','p','q','r' };
char* ptr = &names[0];
for (int i = 0; i < 18; i++) {
reverses(ptr + i);
}
}
解决方案
你在一个循环中调用了 18 次 reverse 函数,每次你传递一个指向 char 数组的下一个字符的指针,所以在第二个循环之后,你已经在访问数组边界之外的元素。
仅调用reverses
一次,并在还原完成后打印字符。
void reverses(char* p) {
int count = 17;
for (int i = 0; i < 18 / 2; i++) {
char temp = *(p + i);
*(p + i) = *(p + count);
*(p + count) = temp;
count--;
}
}
int main()
{
char names[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r'};
char *ptr = &names[0];
reverses(ptr);
for(int i = 0; i < 18; i++){
std::cout << ptr[i];
}
}
请注意,对于一个简单的反向例程,只需要一半的周期,否则您将数组返回到它的原始形式。
这是一个简化的,因此更易读的版本,您将数组的大小作为参数传递:
void reverses(char *p, int size)
{
for (int i = 0; i < size / 2; i++, size--) // size would be 18
{
char temp = p[i]; // swap routine
p[i] = p[size - 1];
p[size - 1] = temp;
}
}
使用[]
数组表示法更简单且更具可读性,但如果您愿意,可以使用指针表示法:
void reverses(char *p, int size)
{
for (int i = 0; i < size / 2; i++, size--)
{
char temp = *(p + i);
*(p + i) = *(p + size - 1);
*(p + size - 1) = temp;
}
}
最终结果相同,但代码可读性较差。
我会使用算法库std::reverse
:
#include <algorithm>
//...
std::reverse(ptr, ptr + 17);
for(int i = 0; i < 18; i++){
std::cout << ptr[i];
}
推荐阅读
- sql - 2 做同样事情的查询不起作用
- amazon-web-services - 运行 terraform apply 时如何从多个提供者中进行选择?
- discord - 我正在处理我的踢命令,我想出了这个错误:
- c# - 无法加载文件或程序集“Microsoft.Windows.Design,Version=3.5.0.0,或其依赖项之一
- python - 用批次计算 BCE 反向传播中的 dx
- python - boto3:python脚本中的execute_command
- google-cloud-firestore - 如何在 Cloud Firestore 中强制执行 App Check?
- sql - Laravel Eloquent:使用 whereRaw 搜索“LIKE %%”
- kubernetes - cockroachdb gcp kubernetes错误无法获取证书
- wordpress - 如何在帖子类型中按类别计算帖子?