【发布时间】:2016-12-17 08:28:47
【问题描述】:
我现在在 c 中遇到 memcpy() 的问题,希望有人能提供帮助。
我的程序允许用户将字符串输入到 char 指针中,然后计算所有可能的排列。随着排列的生成(用户输入指针变为排列),排列通过 memcpy 复制到第二个 char 指针中。它工作得很好,除非字符串有两个或更多不同的重复字符(例如“CCBB”或“AADD”)。如果用户输入这样的内容,memcpy(甚至 strcpy)会导致程序崩溃。
void Permute(char * word, char ** printPerm, int start, int end)
{
if (start == end)
{
memcpy(printPerm[permIndex], word, strlen(word) + 1);
++permIndex;
}
else
{
for (int i = start; i <= end; ++i)
{
Swap((word + start), (word + i));
Permute(word, printPerm, start + 1, end);
Swap((word + start), (word + i));
}
}
}
void Swap(char *a, char *b)
{
char temp;
temp = *a;
*a = *b;
*b = temp;
}
我尝试为两个指针分配更多内存,但结果证明是徒劳的。除了这个,其他一切都有效。
因为我在 Windows (MinGW) 上使用 gcc,所以没有显示我崩溃的详细信息。它只是说“perm.exe 已停止工作”。我使用了一系列 printf() 语句,发现程序在 memcpy() 行崩溃了。
关于代码的一些细节:
“word”字符指针保存用户的输入。它将被程序变形为排列,其内容将被转储到“printPerm”中。 “printPerm” 保存排列的 char 指针数组,稍后将在排列按字母顺序排序并删除任何重复条目时用于打印排列。 "permIndex" 是 "printPerm" 的索引,每次向 "printPerm" 添加排列时都会进行迭代。
抱歉,我没有更多详细信息,但使用文本编辑器和 gcc 意味着我没有得到太多的调试器。似乎只有在字符串包含两个或多个不同的重复字符时,在指针之间传输数据的任何方法都会使程序崩溃。
【问题讨论】:
-
请edit您的问题包括minimal reproducible example。
-
"用户将字符串输入到 char 指针中" - 坏主意!指针不是数组。您绝对不希望用户在 指针中输入任何内容!
-
我通过编写自己的
main函数测试了您的Permute函数,它似乎对我测试的输入工作正常。我测试了AABB、AABBB等。我认为您在此处显示的Permute函数没有问题。你可以编辑你的问题并添加你调用 Permute 的函数吗?如果printPerm[permIndex]未指向有效内存,并且permIndex未正确初始化,则会出现问题。 -
显示 printPerm 的声明。这是可能的故障点。
-
我怀疑问题在于您的代码计算出
printPerm数组的大小是计算唯一字符。因此“ABCD”有 4 个唯一字符,并且排列数计算正确。但是“AADD”只有 2 个独特的字符。您的Permute函数不考虑重复字符,因此它仍会尝试计算 24 个排列。您需要向我们展示您如何确定printPerm数组的大小。
标签: c algorithm pointers char memcpy