C 以sizeof作为字符串维数的分段错误

C 以sizeof作为字符串维数的分段错误,c,arrays,segmentation-fault,sizeof,dimension,C,Arrays,Segmentation Fault,Sizeof,Dimension,我正在写一个小程序来排列字符串矩阵。在排序算法中,我使用此函数交换两个字符串,但在相同的情况下,程序会因分段错误而崩溃。我知道这是由我如何将临时字符串日化引起的,但我不明白为什么 void stringSwap(char*string1,char*string2) { const int dim=sizeof(string1); char temp[dim]; strcpy(temp,string1); strcpy(string1,string2); str

我正在写一个小程序来排列字符串矩阵。在排序算法中,我使用此函数交换两个字符串,但在相同的情况下,程序会因
分段错误而崩溃。我知道这是由我如何将
临时字符串
日化引起的,但我不明白为什么

void stringSwap(char*string1,char*string2)
{   const int dim=sizeof(string1);
    char temp[dim];
    strcpy(temp,string1);
    strcpy(string1,string2);
    strcpy(string2,temp);
}

有人能解释一下为什么会出现这个错误吗?有没有另一种模式可以在不使用dinamic分配的情况下正确地完成这件事,我实际上不知道?多谢各位

string1
是一个指针(即使数组被分解为指针,也不是数组),并且一些指针的
sizeof
是固定的(通常是以字节为单位的字大小,例如32位机器上的4字节,64位机器和系统上的8字节)

某些指针的大小是编译时常量,不取决于该指针的值。

sizeof(string1)
是4或8个字节,具体取决于您的系统

您应该改用strlen(string1)+1

试试:

void stringSwap(char*string1,char*string2)
{   
    char temp[strlen(string1)+1];
    strcpy(temp,string1);
    strcpy(string1,string2);
    strcpy(string2,temp);
}
此声明

const int dim=sizeof(string1);
将返回指向char的指针的sizeof,即
sizeof(char*)
。它通常等于4或8字节,具体取决于运行程序的平台


我认为两个字符串的大小应该相同(它们可以有不同的实际长度,但大小应该相等),您必须将该大小传递给函数,否则此交换函数没有意义。

您应该使用not
sizeof
。sizeof不能按您希望的方式工作。标准C++也没有可变长度数组,看起来像C代码,不是C++的!您的代码具有未定义的行为。你不能把o传递给标准的C字符串函数。谢谢你。我编辑。char *TEMP=“”是我原来的意思。数组的大小应该是C++中的常量表达式。所以这个语句char temp[strlen(string1)+1];是无效的。哦,对不起。问题是C问题,不是C++,不用担心。我知道你的意思。我也是一个大C++的家伙。如果这是C++,那么整个函数可以是:Strug1..SWAP(Strug2);