所以我有这个非常奇怪的问题。我有一个 Swap() 函数来交换任何类型的 2 个变量:
int Swap(void *item1, void *item2, size_t size) {
void *temp_tab;
if (sizeof(item1) != sizeof(item2)) return 2;
temp_tab = malloc(sizeof(item1) * size);
if (NULL == temp_tab) return 1;
memcpy(temp_tab, item1, sizeof(item1));
memcpy(item1, item2, sizeof(item2));
memcpy(item2, temp_tab, sizeof(temp_tab));
free(temp_tab);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在我的主程序中使用它,如下所示:
int main(int argc, char *argv[]) {
int a = 9;
int b = 5;
int c = 2;
int d = 6;
int result;
printf("A: %d\nB: %d\nC: %d\nD: %d\n", a, b, c, d);
result = Swap(&a, &b, sizeof(int));
printf("%d\n", result);
printf("A: %d\nB: %d\nC: %d\nD: %d\n", a, b, c, d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是输出:A:5 B:9 C:5 D:6
不知何故,我的 Swap() 函数正在访问我的 c 变量 - 我认为它与内存冲突有关,但我不知道如何处理这个问题。任何帮助将不胜感激。
PS:结果= 0
sizeof在指针返回的大小指针,不是它可能指向。所以比较sizeof(item1) != sizeof(item2)没有意义,因为它总是错误的。
而这个sizeof指针的问题是你的问题的根本原因:您分配了太多的内存,并始终复制一个指针,而不是数据的大小(这将导致大小不确定的行为,如果一个指针的大小是不同的数据的实际大小)。
你有数据的大小(以字节为单位)和size参数。您需要将其用于分配和复制:
temp_tab = malloc(size);
memcpy(temp_tab, item1, size);
memcpy(item1, item2, size);
memcpy(item2, temp_tab, size);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
52 次 |
| 最近记录: |