C++ 数组是通过引用传递的,但是如果我只传递未存储在内存中的数组的值,会发生什么呢?

C++ 数组是通过引用传递的,但是如果我只传递未存储在内存中的数组的值,会发生什么呢?,c++,c,arrays,reference,parameter-passing,C++,C,Arrays,Reference,Parameter Passing,我设计了这个小程序,目的是按照字母顺序对C字符串中的所有字符进行排序 #include <stdio.h> #include <string.h> void SortLettersInString(char A[]); int getSizeOfString(char A[]); int main() { char str[]="sbcdhiksjaghgfhsghjawyeqsadfsazxx"; //THIS WORKS: SortLett

我设计了这个小程序,目的是按照字母顺序对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;
}
#包括
#包括
void SortLettersInString(char A[]);
int getSizeOfString(char A[]);
int main()
{
char str[]=“sbcdhiksjaghgfhsghjawyeqsadfsazzx”;
//这项工作:
SortLettersInString(str);
//这会使程序崩溃:
//SortletersinString(“AAACBSVSFSA”);
scanf(“%d”);
返回0;
}
void SortletersinString(字符A[])
{
printf(“原始字符串:%s\n”,A);
int-sizeOfA=getSizeOfString(A);
printf(“字符串大小:%d\n”,sizeOfA);
int i,j;
对于(i=0;i
它在内存中。以太中不存在字符串文字,它们是程序静态内存的一部分,您可以将它们的地址传递给函数。碰巧这不是允许程序修改的内存,如果它试图修改它,则程序的行为是未定义的

<> P> >注意,在C++中,字符串文字类型为<代码> const char(12)< /> >(并且更为正确),并且程序<>强>不会编译(因此C++标签是可疑的)。
这项工作的原因是:

char str[]="sbcdhiksjaghgfhsghjawyeqsadfsazxx";
//THIS WORKS:
SortLettersInString(str);
这是因为这里发生了完全不同的事情。您定义了一个具有自动存储的局部数组,并通过复制文本来初始化其元素。修改局部变量非常好,而且定义得很好,它根本不是常量变量

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

<> P> >注意,在C++中,字符串文字类型为<代码> const char(12)< /> >(并且更为正确),并且程序<>强>不会编译(因此C++标签是可疑的)。
这项工作的原因是:

char str[]="sbcdhiksjaghgfhsghjawyeqsadfsazxx";
//THIS WORKS:
SortLettersInString(str);
这是因为这里发生了完全不同的事情。您定义了一个具有自动存储的局部数组,并通过复制文本来初始化其元素。修改局部变量非常好,而且定义得很好,它根本不是常量变量

<>这是<强>不是引用< /强>。引用只存在于C++中,并且不可能引用未知大小的数组;如果代码< < /COD>引用:

,代码将是这样的。
void SortLettersInString(char (&A)[100])
这里的函数是一个指针,指向一个可修改的对象(即非
const
char
对象。
[]
语法只是一个提示,表明该对象可能是整个可修改的
char
对象数组的开始;它与
char*a
没有任何关系或不同

在任何情况下,函数都会使用您授予它的非
常量
自由来修改对象,代码如下:
A[i]=A[i]^A[j];

到目前为止,一切顺利

这就像编写
intx[]={1,2,3};
。您可以修改数组的三个元素,但当然不能修改数字1,2和3本身。数组元素只是不可修改文字的可修改副本

类似于
“sbcdhiksjaghgfhsghjawyeqsadfsazzx”
的字符串文字就像整数文字数组
1
2
3
。文字本身无法修改,但文字可用于创建可修改的副本。您的
str[]
是从文本的不可修改
char
对象复制的可修改
char
对象数组

根据您使用的语言、编译器和编译器设置,这甚至不应编译。如果编译,则为未定义行为。您将不可修改的文本直接传递给函数。函数尝试修改不应修改的内容

碰撞是未定义行为的一种可能结果

你在这里所做的与此相当:


尝试和修改字符串文字是个坏主意的一个很好的实际原因是编译器可以执行名为字符串文字池的优化,这允许相同的字符串文字共享相同的内存区域

<>这是<强>不是引用< /强>。引用只存在于C++中,并且不可能引用未知大小的数组;如果代码< < /COD>引用:

,代码将是这样的。
void SortLettersInString(char (&A)[100])
这里的函数是一个指针,指向一个可修改的对象(即非
const
char
对象。
[]
语法只是一个提示,表明该对象可能是整个可修改的
char
对象数组的开始;它与
char*a
没有任何关系或不同

在任何情况下,函数都会使用您授予它的非
常量
自由来修改对象,代码如下:
A[i]=A[i]^A[j];

到目前为止,一切顺利

这就像编写
intx[]={1,2,3};
。您可以修改数组的三个元素,但当然不能修改数字1,2和3本身。数组元素只是不可修改文字的可修改副本

类似于
“sbcdhiksjaghgfhsghjawyeqsadfsazzx”
的字符串文字就像整数文字数组
1
2
3
。文字本身无法修改,但文字可用于创建可修改的副本。您的
str[]
是从文本的不可修改
char
对象复制的可修改
char
对象数组

这取决于您使用的语言、编译器和编译器设置
char str[]="sbcdhiksjaghgfhsghjawyeqsadfsazxx";
//THIS WORKS:
SortLettersInString(str);
//THIS CRASHES THE PROGRAM:
//SortLettersInString("AAACBSVSFSA");
void changeToTwo(int* x)
{
    *x = 2;
}

int main()
{
  changeToTwo(&1); // will not compile
  int one = 1;
  changeToTwo(&one); // will compile and work fine
}
//THIS CRASHES THE PROGRAM:
//SortLettersInString("AAACBSVSFSA");