【发布时间】: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