簡體   English   中英

C - 在 function 中使用 memcpy 分配值而不是返回

[英]C - using memcpy in function to assign value instead of return

嘗試了解 C 中的 arrays 是如何工作的,以及 C 是如何工作的。 我想做一個 function 返回一個 2 元素數組並將該數組分配給一個變量。 首先我做到了;

int make_array(int i) {
   int out[2] = {i, i + 1};
   return (int) *out;}

int main(void) {
    int arr[2] = { make_array(68) }; // should be {68, 69}
    for (int i = 0; i < 2; i++) {
        printf("%d, ", arr[i]);}
    return 0;

>> 68, 0,

這是我能找到的唯一一種在不引發錯誤的情況下編寫它的方法,它是 output 68, 0,而不是 68, 69,。 所以我嘗試了這個;

void make_another_array(int j, void *vp) {
   int out[2] = {j, j + 1};
   memcpy(vp, &out, sizeof(int) * 2);}

int main(void) {
   int *hotdog_water = malloc(sizeof(int) * 2);
   make_another_array(68, hotdog_water);
   for (int i = 0; i < 2; i++){
       printf("%d, ", hotdog_water[i]);}
   free(hotdog_water); hotdog_water = NULL;
   return 0;}

function 將結果保存在某處而不是返回它。 最終結果似乎按照我想要的方式工作,但不從 function 返回的東西中分配值似乎很麻煩。 我確信有更好的方法來做這個特定的事情,但是這樣做有什么根本錯誤嗎? 如果我寫一個指針指向所有東西的地方而不是使用返回,我會遇到什么問題? 是否有任何用於復制結果而不是返回結果的用例?

在調用例程提供的空間中返回數據是正常且常見的。 標准 C 庫包括幾個示例,例如:

  • scanf("%d%d", &a, &b)將值存儲在ab中。
  • frexp(float x, &e)返回一個值並將另一個值存儲在e中。
  • fread(array, size, number, stream)array中提供number值。

如果您確實希望通過函數返回值機制提供兩個值,則可以使用以下結構來實現:

struct foo { int v[2]; } make_array(int i)
{
    return (struct foo) {{ i, i+1 }};
}

#include <stdio.h>

int main(void)
{
    struct foo x = make_array(68);
    for (int i = 0; i < 2; ++i)
        printf("%d, ", x.v[i]);
    printf("\n");
}

對於大型結構,C 實現通常實現返回機制,正如您使用指針所建議的那樣: C 代碼看起來像 function 代碼中的結構體,調用例程的指針提供結構體,它作為 function 的參數。 返回時,function 使用該指針填充返回值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM