[英]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)
將值存儲在a
和b
中。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.