简体   繁体   中英

C passing array of pointers

This relates to C. I am having some trouble understanding how I can assign strings to char pointers within arrays from a function.

#include <stdio.h>
#include <string.h>

void function(char* array[]);

int main(void)
{
    char* array[50];
    function(array);
    printf("array string 0: %s\n",array[0]);
    printf("array string 1: %s\n",array[1]);

}

void function(char* array[])
{
    char temp[] = "hello";
    array[0] = temp;
    array[1] = temp;

    return;
}

Ideally, I would like the main printf function to return

array string 0: hello
array string 1: hello

But I'm having trouble understanding arrays of pointers, how these pass to functions and how to manipulate them in the function. If I declare a string like char temp[] = "string" then how do I assign this to one of the main function array[i] pointers? (assuming I have my jargon right)

char temp[] = "hello"; only creates a local, temporary array inside the function. So when the function exists, the array will be destroyed.

But with array[0] = temp; you're making array[0] point to the local array temp .

After the function returns, temp doesn't exist anymore. So accessing array[0] which pointed to temp will cause undefined behavior.


You could simply make temp static, so it also exists outside the function:

static char temp[] = "hello";

Or, you could copy the "hello" string to array[0] and array[1] . For copying C-strings, you normally use strcpy .

char temp[] = "hello";
strcpy(array[0], temp);
strcpy(array[1], temp);

However , before copying you need to make sure array[0] and array[1] point to memory that has enough space to hold all characters of "hello" , including the terminating null character. So you have to do something like this before calling strcpy :

array[0] = malloc(6); 
array[1] = malloc(6);

(6 is the minimum numbers of characters that can hold "hello" .)

how do I assign this to one of the main function array[i] pointers

  1. Arrays cannot be assigned.
  2. A pointer cannot hold an array, it can only refer to an array. For the latter the pointer needs to get an array's address assigned.

Referring 1.

This

char temp[] = "hello";

isn't an assigment, but an initialisation.

This

char temp[];
temp[] = "hello";

would not compile (the 2nd line errors), as an array cannot be assigned.

Referring 2.

This

char* array[50];

defines an array of 50 pointers to char , it could reference 50 char -arrays, that is 50 C-"strings". It cannot hold the C-"strings" themselfs.

Example

Applying what is mentioned above to your code whould lead to for example the following:

#include <stdio.h>
#include <string.h>

void function(char* array[]);

int main(void)
{
  char* array[50];

  /* Make the 1st two elements point to valid memory. */
  array[0] = malloc(42); /* Real code shall test the outcome of malloc() 
                            as it might fail and very well return NULL! */
  array[1] = malloc(42); 
  function(array);
  printf("array string 0: %s\n",array[0]);
  printf("array string 1: %s\n",array[1]);

  return 0;
}


void function(char* array[])
{
  char temp[] = "hello";

  /* Copy the content of temp into the memory that was allocated to 
     the array's 1st memebrs in main(). */
  strcpy(array[0], temp);
  strcpy(array[1], temp);

  return;
} 

first, you need to allocate the destination.

second, char temp[] = "hello"; in function() is local variable. you cannot use their outside of the function. use strcpy to copy the content.

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

void function(char* dest)
{
    char temp[] = "hello";
    strcpy(dest, temp);
    return;
}

int main(void)
{
    // or just char dest[10] = {0};
    char *dest = malloc(10);

    function(dest);
    printf("dest: %s\n", dest);
}

In you program, you defined char* array[50]; , so you need to create memory space for each item:

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

void function(char* a[])
{
    char temp[] = "hello";
    strcpy(a[0], temp);
    strcpy(a[1], temp);
    return;
}

int main(void)
{
    char *a[50];
    int i = 0;
    for (i = 0; i < 50; ++i)
        a[i] = malloc(10);

    function(a);
    printf("a[0]: %s\n", a[0]);
    printf("a[1]: %s\n", a[1]);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM