在函数内部分配指向数组文字的指针

时间:2018-02-11 14:45:21

标签: c arrays pointers

我有以下代码:

void dereference_pointer(int* pointer){
  pointer = (int[]){1, 2, 3};

  printf("%d | %d | %d\n", pointer[0], pointer[1], pointer[2]);
  // This prints "1 | 2 | 3", like I wanted
}

int main(void) {
  int *pointer;

  pointer = malloc(sizeof(int)*3);
  dereference_pointer(pointer);

  printf("%d | %d | %d\n", pointer[0], pointer[1], pointer[2]);
  // This prints "0 | 0 | 0", essentially undoing what happened inside the function

  return 0;
}

我不完全确定pointer = (int[]){1, 2, 3};是将指针指向新数组的正确方法,但这是我能做到的唯一方法,它不会给我类型错误。

2 个答案:

答案 0 :(得分:2)

pointer内分配dereference_pointer不会在函数外部更改pointer,因为它是按值发送的。您可以将其更改为:

#include <stdio.h>
#include <stdlib.h>

// Note the ** instead of *
void dereference_pointer(int** pointer){
  *pointer = (int[]){1, 2, 3}; // note dereferencing here
  //                        and here       and here      and here  :)
  printf("%d | %d | %d\n", (*pointer)[0], (*pointer)[1], (*pointer)[2]);
  // This prints "1 | 2 | 3"
}

int main(void) {
  int *pointer;

  pointer = malloc(sizeof(int)*3);
  dereference_pointer(&pointer); // by reference 

  printf("%d | %d | %d\n", pointer[0], pointer[1], pointer[2]);
  // This prints "0 | 0 | 0"
  return 0;
}

这应该可以解决你最终得到的0 | 0 | 0

至于此:

  

我不完全确定pointer =(int []){1,2,3};

这很好。你的指针指向一个没问题的数组。当函数返回时,您将留下一个具有正确值的指针。

你可以改用这个美女:-P:

void dereference_pointer(int** pointer){
  **pointer=1, *(*pointer+1)=2, *(*pointer+2)=3;

  printf("%d | %d | %d\n", (*pointer)[0], (*pointer)[1], (*pointer)[2]);
  // This prints "1 | 2 | 3"
}

但你的方式是一个单行且更易读的IMO。

答案 1 :(得分:1)

  

我并不完全确定指针=(int []){1,2,3};是指向新数组的指针的正确方法,但这是我能做到的唯一方法,它不会给我一个类型错误。

传递给函数的指针是数组。这是因为当作为参数传递时,数组会衰变为指向第一个元素的指针。因此,您需要传递数组中的元素数。 (知道数组的起始地址并没有告诉你有关结束的任何事情)。

示例:

void print(int *data, size_t n)
{
    for (size_t i = 0; i < n; ++i)
        printf("%d\n", data[i];
}

实际上,函数签名也可以写成

int data[], size_t n

调用者代码可能如下所示:

int *data = malloc(n * sizeof(int));
/* populate the dynamically allocated array */
print(data, n);

或者看起来像这样:

int data[MAX];
/* populate array */
print(data, MAX);