【问题标题】:What's is happening with the array elements?数组元素发生了什么?
【发布时间】:2019-08-06 23:31:01
【问题描述】:

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

这就是这段代码所期望的:

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 时,数组元素究竟发生了什么?

以及如何解决?

【问题讨论】:

  • 你试过调试你的程序吗?
  • malloc 创建一个新的内存块,但您似乎认为它会扩展当前块或其他内容,请查看realloc。同样不清楚为什么main 函数中的循环开始输出i[-1],因为这将超出分配范围。另外,想想coincide如果找不到字母会做什么。
  • 嘿,@M.M 先生,感谢您的反馈,我设法让它工作了!非常感谢,这就像不假设 malloc 函数会扩展给定块一样简单。

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


【解决方案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);
}

【讨论】:

  • 如果没有找到字母,它仍然返回一个未初始化的指针;而且您不需要u == 0 的特殊情况,因为您可以首先将i 初始化为NULL 并每次都使用realloc(重新分配空指针是安全的)
  • 确实如此。我编辑了代码,使其符合您的想法。我正在回答我自己的问题,但这只是因为你的帮助。谢谢!
猜你喜欢
  • 2013-09-20
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多