【问题标题】:Pass by referencing not maintaining its integer value通过引用不保持其整数值传递
【发布时间】:2013-12-10 13:30:15
【问题描述】:

我提出了一个新问题,因为我认为这与我之前的问题不同:Trouble looping through arrays define in other source files

我目前遇到的问题是我通过引用另一个函数传入 size_t 值,然后我在该函数中设置所述 size_t 的值,然后我可以在另一个函数中设置。

我面临的问题是,当我传入 size_t 变量时,设置值的函数会正确设置它的值,但是当我返回声明变量的源文件时,它再次具有“随机”值。

有人知道为什么会这样吗?

system_handler.c

size_t ship_size;
size_t asset_size;

mayday_call* mday_ptr;
ship* ship_ptr;
rescue_asset* assets_ptr;

mday_ptr = read_mayday_file();
ship_ptr = read_ship_locations(&ship_size);
assets_ptr = read_recuse_assets(&asset_size);

printf("ships size : %d\n", ship_size);
printf("assets size : %d\n", asset_size);

ship.c

ship* read_ship_locations(size_t* size){
//no_of_lines is an unsigned int
//locof is a char array containing a file name
    no_of_lines = (count_lines(locof) -1 );
    printf("number of lines = %d \n", no_of_lines);


    size = (unsigned int)no_of_lines;
    size = no_of_lines;

}

rescue_assets.c

rescue_asset* read_rescue_assets(size_t* size) {
    //no_of_lines is an unsigned int
    //locof is a char array containing a file name
    no_of_lines = count_lines(locof);
    printf("number of lines = %d \n", no_of_lines);

    assets = calloc(no_of_lines,sizeof (rescue_asset));

    size = (unsigned int)no_of_lines;

    printf("size : %d\n", size);
}

控制台输出:

please enter the file name for the ship locations data: 
ships_1.txt
number of lines = 4 
size : 4
Please enter the file name for the rescue assets data: 
rescue_assets.txt
number of lines = 37 
size : 37
ships size : 134513984
assets size : 0

【问题讨论】:

  • 糟糕! C 中不能通过引用传递!!

标签: c parameter-passing pass-by-reference


【解决方案1】:

正如评论者所说,C 不支持真正的传递引用;您需要做的是传递变量的地址,并将其用作函数体中的指针。如果size 被声明为指向size_t 的指针,则需要以这种方式显式引用它:

*size = (size_t)no_of_lines;

而不是

size = (size_t)no_of_lines;

编辑:使用gcc -Wall 进行编译会发出类型转换警告,这将有助于解决这个问题。

【讨论】:

  • +1 打开警告应该有助于捕捉到这一点,因此您可能希望将其添加到您的答案中。例如,gcc 会警告 assignment 从不强制转换的整数中生成指针
  • @alk 强制转换为size_t 仍会产生警告,并且并非所有分配都有强制转换。
  • 我还需要参数中的 *size 吗?当我将 *size 放入参数中并将 *size 放入函数体时,大小值变为 -10 亿。我什至添加了 size_t 演员表。
  • 参数声明size_t* size已经声明它是一个指针。这不需要改变。
  • 那么当我添加建议的更改时,我怎么会得到 -10 亿大小的值?
【解决方案2】:

正如黑客评论的那样:C 中没有传递引用。当您传递size_ts 的地址时,它们就是:地址。然后,当您在read_ship_locations 中将no_of_lines 分配给size 时,您正在本地 更改该地址。您需要取消引用地址并将其分配给该地址:

*size = no_of_lines;

提示:我假设您将 no_of_lines 转换为 (unsigned int),因为编译器会在您不这样做时警告有关 int-to-pointer 转换。当编译器建议一个你不想要的演员时,它几乎总是不是解决你的问题的方法。在这种情况下:当您将no_of_lines 分配给size 时,您将int 分配给size_t *,这不是一个好主意,因为地址no_of_lines 很可能不是有效的。

【讨论】:

  • 所以我应该将 no_of_lines 的返回类型和变量类型更改为 size_t 而不是 unsigned int 吗?即使我将其转换为 (size_t),我的 size 值为 -10 亿
  • 你需要做 *size = ,而不是 size =
  • 成功了,我在打印时使用的是 %d 而不是 %zu!啊哈!
猜你喜欢
  • 2010-12-31
  • 1970-01-01
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 2020-04-01
  • 2019-08-04
  • 2013-04-21
相关资源
最近更新 更多