我想使一些成功的二维动态字符串数组,但由于某种原因两个int变量,这实际上是行数(指针数组)和大小(可以多久),变成一个神秘的价值。Int变量神奇地改变从void返回后的值
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
void write (char ***p, int size_r, int size_c)
{
int i;
for (i = 0; i < size_r; i++)
{
printf("%s", p[i]);
}
return;
}
void arr_of_p (char*** p, int size_r, int size_c)
{
int i;
for (i = 0; i < size_r; i++)
{
p[i] = "helo\n";
}
return;
}
int main(void)
{
int string_n; printf("How many strings: "); scanf("%d", &string_n);
int string_l; printf("How long are the strings: "); scanf("%d", &string_l);
char **s_p = (char**) malloc(string_n*sizeof(char*));
int i;
for (i = 0; i < string_n; i++)
{
s_p[i] = (char*) malloc(string_l*sizeof(char));
}
arr_of_p(&s_p, string_n, string_l);
printf("%d\n%d\n", string_n, string_l); // for debugging purpose, add breakpoint here.
//"string_n" and "string_l" will be identical to the value of "i" in "arr_of_p()" for some reason...
write(&s_p, string_n, string_l);
return 0;
}
如果'string_l'应该是您输入字符串的最大长度,并且*符合*那个长度,那么您的分配大小就会被忽略。你不会考虑终止nullchar房间。而Fyi,在这个代码中我不需要三重间接,我可以看到。另外,这会像筛子一样泄漏内存,并且会在'arr_pf_p'中孤立动态分配内存。最后(无关),[不要在C程序中投射'malloc'](https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)。它可以毫不夸张地说,并可以很容易地隐藏不好。 – WhozCraig
您的'arr_of_p'函数将同一个静态字符串'“helo \ n”'分配给's_p'中的所有指针。因此,在'main'循环中早些时候为字符串分配空间并不重要 - 所有内存都在泄漏。另外,'arr_of_p'中的'char *** p'参数不是你想要的。所以'p [i] = ...'这一行也是错误的(你确定没有编译器的警告吗?) –
实际上,这就是为什么你的int变量越来越小 - arr_of_p正在写地址静态字符串覆盖它们的值。 –