gpt4 book ai didi

c++ - 将保存数组元素的指针的地址传递给 C++ 中的函数时出错

转载 作者:行者123 更新时间:2023-12-04 07:44:42 26 4
gpt4 key购买 nike

我创建了一个字符数组,然后将它们分配给一个指针。然后我将该指针地址传递给一个函数,该函数将一个字符一个字符地反转数组并将它们打印出来。我无法理解代码中的错误。

// 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);
}
}

最佳答案

您在循环中调用 reverse 函数 18 次,每次传递指向 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];
}

关于c++ - 将保存数组元素的指针的地址传递给 C++ 中的函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67255737/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com