结构化链表到数组

wiw*_*wen 2 c arrays malloc pointers

typedef struct node {
    int value;
    struct node* next;
}node;

int* to_array (node* ll, int size) {
    int i = 0;
    int* arr = malloc(size*sizeof(int));
    while (ll) {
          arr[i] = ll->value;
          ll = ll->next;
          i++;
    }

return arr;
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释原因

int* arr = malloc(size);
Run Code Online (Sandbox Code Playgroud)

会给我们一个数组吗?我想当我们有指针时,我们不能单独改变它arr[i] = 5或类似的东西.

Fog*_*Day 5

你的确是一个非常好的问题.当然,已经有人问过并多次回答SO.但是一个好问题.

从C/C++ FAQ:

http://c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=aryptr

数组不是指针,尽管它们密切相关(参见问题6.3)并且可以类似地使用(参见问题4.1,6.8,6.10和6.14).

  1. 声明一个数组(例如int a[5])时,您已经为五个"int"元素分配了存储空间.您可以访问每个元素a[i].

  2. 当您声明指针(例如int *b)时,您尚未分配任何存储空间.

  3. 您可以同时声明和初始化指针:

    int *b = NULL;  /* Initialize to 0 */
    ... OR ...
    int *b = malloc (5 * sizeof (int)); /* Allocate storage for 5 "int" elements */
    
    Run Code Online (Sandbox Code Playgroud)
  4. 声明数组时a,您从堆栈中分配了空间.分配无法更改.

    声明时b,您分配了相同的空间量,但是您已从堆中分配.此外,您可以随时更改b为指向其他任何内容.您还可以通过realloc()内存来更改存储空间.

  5. 就像您可以使用索引语法一样a[i],您使用完全相同的语法b[i].

此链接可能有助于解释:http://www.geeksforgeeks.org/g-fact-5/

PS:当你"有一个指针",你最肯定CAN "更改个别像arr[i] = 5什么".