数组元素正在发生什么?

时间:2019-08-06 23:31:01

标签: arrays pointers dynamic-memory-allocation memory-address

一切似乎都很好。除非它不起作用。

这是这段代码所期望的:

Write a function that:

 Receives: a string;               (str)
          a letter;                (l)
          an address of an integer (&j)

 returns: an integer array;        (*(i + k))
          an integer value.        (j)

数组的每个位置都应包含找到字母的位置。整数值应包含创建的数组的大小

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

    int *coincide(char *str, char l, int *j){
      int *i, k, u, n = strlen(str);
      for(k = u = 0; k < n; k++){
        if(l == str[k]){
          i = (int *) malloc(++u * sizeof(int));
          i[u - 1] = k;
          printf("i[%d - 1] = %d\n", u, i[u - 1]);
        }
      }
      *j = u;
      return i;
    }

    void main(){
      char str[] = "testtest", l = 't';
      int *i, j;
      i = coincide(str, l, &j);
      if(j > 0){
        for(int k = 0; k < j; k++) printf("i[%d] = %d\n", k, i[k]);
        puts("");
      }
    }

在linux上,结果是:

i[1 - 1] = 0
i[2 - 1] = 3
i[3 - 1] = 4
i[4 - 1] = 7
i[0] = 0
i[1] = 0
i[2] = 0
i[3] = 7

在Windows上,结果似乎是垃圾值而不是零。只有最后一个值是正确的。

那么,当函数等于i时,数组元素到底发生了什么?

以及如何解决?

1 个答案:

答案 0 :(得分:1)

由于@ M.M的洞察力,我使程序可以处理此更改:

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

int *coincide(char *str, char l, int *j){
  int *i = NULL, k, u, n = strlen(str);
  for(k = u = 0; k < n; k++){
    if(l == str[k]){
        i = (int *) realloc(i, ++u * sizeof(int));
        i[u - 1] = k;
    }
  }
  *j = u;
  return i;
}

void main(){
  char str[] = "testtest", l = 't';
  int j, *i = coincide(str, l, &j);
  if(j > 0) for(int k = 0; k < j; k++) printf("i[%d] = %d\n", k, i[k]);
  if(j == 0) printf("\nThere's no ocorrence of '%c' character in '%s'\n", l, str);
}