【问题标题】:Swapping C variable交换 C 变量
【发布时间】:2019-09-16 21:23:39
【问题描述】:

作为练习,我试图用一个以 void 指针作为参数的函数交换变量内容。 我不明白为什么它总是为第一个变量返回一个随机值。

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

void swap(void* vp1, void* vp2, int size)
{ 
  char buffer[size];
  memcpy(buffer, vp1, size);
  memcpy(vp1, vp2, size);
  memcpy(vp2, buffer, size);
}

void main()
{
  int g1 = 243;
  int g2 = 28;

  printf("g1 before swap = %i\n", g1);
  printf("g2 before swap = %i\n", g2);

  printf("&g1 = %p\n", &g1);
  printf("&g2 = %p\n", &g2);

  swap(&g1, &g2, sizeof(int*));

  printf("-------------------------\n");

  printf("g1 after swap = %i\n", g1);
  printf("g2 after swap = %i\n", g2);

  printf("&g1 = %p\n", &g1);
  printf("&g2 = %p\n", &g2);
}
./swap
g1 before swap = 243
g2 before swap = 28
&g1 = 0x7ffee832072c
&g2 = 0x7ffee8320728
-------------------------
g1 after swap = -399374528
g2 after swap = 243
&g1 = 0x7ffee832072c
&g2 = 0x7ffee8320728

示例直接取自this course,虽然很有趣

【问题讨论】:

  • 你可能想要sizeof(int)而不是sizeof(int *)
  • 谢谢,就是这样:)
  • Tipp:而不是sizeof(TYPE),更喜欢使用sizeof(EXPRESSION),例如在你的情况下sizeof(g1).
  • 如果你想练习防御性编码,请输入assert(sizeof(g1) == sizeof(g2)) ...
  • 它是sizeof EXPRESSION,因为sizeof 是一个运算符,而不是一个函数。

标签: c pointers memcpy


【解决方案1】:

您交换的大小错误,在您的系统上sizeof (int*) 大于sizeof (int)

从您的输出中我们可以看到,sizeof (int*) 是 8,但 sizeof (int) 是 4。当从 g1 复制到 buffer 时,会多获取 4 个字节,这将在复制时覆盖 g1 的内容bufferg2

把调用改成

swap(&g1, &g2, sizeof g1);

如果您想知道g1 等对象的大小,请使用sizeof g1

【讨论】:

  • 我理解,但这很令人困惑,因为它可以在一台计算机 (Ubuntu) 上与 sizeof(int*) 一起使用,而不是在另一台计算机 (MacOS) 上...你知道为什么以及它是否与操作系统有关(我想) ?
  • 不,它与定义int和指针大小的编译器系统有关。您必须阅读文档或编写一个简单的测试程序才能查看大小。在某些系统上,如 32 位 Ubuntu 指针和 int 可能具有相同的大小,但没有一般规则。在 8051 等微控制器上,指针使用 1 到 3 个字节,具体取决于指针的类型,int 使用 2 个字节。只需使用对象,或者如果不可能使用正确的类型。
  • 您尝试了哪种风格的 Ubuntu? 32 位还是 64 位?
  • 64位Ubuntu 18.04.3 LTS,在这个系统上,打印sizeof(int)sizeof(int*)返回4和8
  • 那么它只是偶然在 Ubuntu 上工作。你查过g1g2的地址了吗? g2的地址是否高于g1的地址?看看你的代码,顺序很重要。
猜你喜欢
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
  • 2015-01-19
  • 2017-04-19
相关资源
最近更新 更多