gpt4 book ai didi

c++ - 数组是通过引用传递的,但是如果我只传递一个没有存储在内存中的数组的值会怎样?

转载 作者:太空宇宙 更新时间:2023-11-04 06:17:29 25 4
gpt4 key购买 nike

我设计了这个小程序,目的是按字母顺序对 C 字符串中的所有字符进行排序。

#include <stdio.h>
#include <string.h>

void SortLettersInString(char A[]);
int getSizeOfString(char A[]);

int main()
{
char str[]="sbcdhiksjaghgfhsghjawyeqsadfsazxx";
//THIS WORKS:
SortLettersInString(str);

//THIS CRASHES THE PROGRAM:
//SortLettersInString("AAACBSVSFSA");
scanf("%d");
return 0;
}

void SortLettersInString(char A[])
{
printf("Original string: %s\n",A);
int sizeOfA = getSizeOfString(A);
printf("Size of string: %d\n", sizeOfA);
int i,j;
for(i=0;i<sizeOfA;i++)
{
for(j=0;j<sizeOfA;j++)
{
if(A[i]<A[j])
{
//INTERCHANGING THE VALUES WITHOUT AUXILIARITY
A[i]=A[i]^A[j];
A[j]=A[i]^A[j];
A[i]=A[i]^A[j];
}
}
}
//PRINT THE SORTED STRING:
printf("Sorted string: %s\n", A);
}

int getSizeOfString(char A[])
{
int i=0;
while(A[i]!='\0')
{
i++;
}
return i;
}

我的问题是:我知道数组只能通过引用传递,所以在我第二次调用函数 SortLettersInString("AAACBSVSFSA") 时,我将 char 数组的值传递给这个函数,当我尝试在函数内部打印该数组的值时,它会正确打印。但为什么要这样做,因为没有为该值保留的内存位置。此外,当函数到达交换值的点时,它会崩溃。那我错过了什么?

最佳答案

SortLettersInString("AAACBSVSFSA"); 

它在内存中。字符串文字不存在于以太中,它们是程序静态内存的一部分,您可以将它们的地址传递给函数。碰巧这不是您的程序被允许修改的内存,如果它试图修改它,您的程序的行为是未定义的。

需要注意的是,在 C++ 中,字符串文字的类型是 const char[12] (这更 const 正确),并且您的程序不会编译(因此 C++ 标记是可疑的)。


这样做的原因:

char str[]="sbcdhiksjaghgfhsghjawyeqsadfsazxx";
//THIS WORKS:
SortLettersInString(str);

是因为这里发生了完全不同的事情。您定义了一个具有自动存储功能的本地数组,并通过复制文字来初始化其元素。修改您的局部变量非常好并且定义明确,它根本不是 const 变量。

关于c++ - 数组是通过引用传递的,但是如果我只传递一个没有存储在内存中的数组的值会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42326520/

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