Home > Software design >  dynamic arrays int printing problem - maybe not a valid memory cell
dynamic arrays int printing problem - maybe not a valid memory cell

Time:05-29

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

int find_lenght(int *arrr){
    int i = 0;
    while(arrr[i] != '\0'){
        i  ;
    }
return i;
}

void init_array(int *arrr){
    arrr=(int*)malloc(1*sizeof(int));
    printf("New element:");
    
    int lenght = find_lenght(arrr);
    scanf("%d", &arrr[lenght]);
    printf("Lenght = %d\n",lenght);
    
    printf("Array elements are:\n");
    for(int i = 0; i <= lenght; i  ) {
        printf("%d,", arrr[i]);
    }
}

void print_array(int *arrr){
    printf("Array elements are:\n");
    int lenght = find_lenght(arrr);
    for(int i = 0; i == lenght; i  ) {
        printf("%d,", arrr[i]);
    }
}

int main() {
    int *arr = NULL;
    init_array(arr);
    print_array(arr);
}

I don't know what am i missing here. My point is to fill in and then print dynamic array

Also my taught is it's not filling the way it should, so it hasn't anything to print.

CodePudding user response:

Your arr pointer in main is never assigned because your init_array assign the address of the allocated memory (the return value of malloc) to the input parameter arrr, which is, a local variable.

You have mainly two solutions to properly achieve what you want to do. The first one (the better one in my point of view), by making your init_array returning the allocated memory address to be assigned:

int* init_array() 
{
  int* retval = (int*)malloc(1*sizeof(int));
  // ... 
  return retval;
}

int main() 
{ 
  int *arr = init_array(); //< assign arr with returned value
}

Another way is to make your init_array function taking a pointer to a pointer, so the function can assign this pointer:

void init_array(int** arrr) 
{
  (*arrr) = (int*)malloc(1*sizeof(int));
  // ... 
}

int main() 
{ 
  int* arr = NULL;
  init_array(&arr); //< pass reference to arr
}

CodePudding user response:

You need to pass the pointer to pointer to int to change passed pointer. Your for loop is invalid in print function. You need also to set the sentinel value yourself.

size_t find_length(const int *arrr)
{
    size_t i = 0;
    if(arrr)
        while(arrr[i]) i  ;
    return i;
}

void add_element(int **arrr, int element)
{
    size_t length = find_length(*arrr);
    int *tmp = realloc(*arrr, (length   2) * sizeof(**arrr));
    
    if(tmp)
    {
        *arrr = tmp;
        (*arrr)[length] = element;
        (*arrr)[length   1] = 0;
    }
}

void print_array(const int *arrr)
{
    printf("Array elements are:\n");
    size_t lenght = find_length(arrr);
    for(size_t i = 0; i < lenght; i  ) 
    {
        printf("arrr[%zu] = %d\n", i, arrr[i]);
    }
}

int main(void) {
    int *arr = NULL;
    add_element(&arr, 5);
    add_element(&arr, 15);
    add_element(&arr, 25);
    add_element(&arr, 35);
    print_array(arr);
}

https://godbolt.org/z/drKej3KT5

CodePudding user response:

the array on your main function is still NULL. the better way to do is just call the print_array() function after you initialize it. you just simply put print_array(arrr) inside init_array() and after the for loop statement.

CodePudding user response:

The line

int lenght = find_lenght(arrr);

may invoke undefined behavior, because find_length requires its argument to be a pointer to the first element of a null-terminated int array. However, the content of the memory pointed to by arrr is indeterminate, because it has not been initialized. Therefore, it is not guaranteed to be null-terminated.

  • Related