How to find number of rows in dynamic 2D char array in C?
那里没什么。
尝试使用以下代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int k = 97;
void foo(char **a)
{
int i = 0;
for(i=0; a[i] != NULL; ++i)
printf("i = %d\n", i);
}
void strcpyo(char* a, char*b){
int i=0;
for(i=0;b[i]!='\0';i++){
a[i]=b[i];
}
a[i]='\0';
}
void strcpym(char* a, char*b){
int i=0;
for(i=0;b[i]!='\0';i++);
memcpy(a,b,i+1);
}
void freee(char** ptr){
int i;
for(i = 0;i < k; ++i)
{
free(ptr[i] );
}
free(ptr);
}
void alloc(char ***p)
{
*p = (char **)malloc(k * sizeof(char *));
int i,j;
for(j=0;j<k;j++)
{
// for(i = 0;i < j; ++i)
{
(*p)[j] = (char *)malloc(11 * sizeof(char));
strcpy((*p)[j],"paicharan");
}
//printf("j = %d ", j);
//foo(p);
}
}
int main()
{
char **p;
alloc(&p);
#if 0
char **p = (char **)malloc(k * sizeof(char *));
int i,j;
for(j=0;j<k;j++)
{
for(i = 0;i < j; ++i)
{
p[i] = (char *)malloc(11 * sizeof(char));
strcpy(p[i],"paicharan");
}
printf("j = %d ", j);
foo(p);
}
#endif
foo(p);
freee(p);
return 0;
}
#if 0
#endif
中的代码完美无缺,但如果我在函数alloc(char**)
中创建数组,它会为数组中的奇数行提供错误的答案。任何人都可以解释原因吗?
即。对于k= odd number
,它给出了错误的答案,但even number
正确。
答案 0 :(得分:2)
您的代码依赖于Undefined Behaviour才能正常工作,即它只能偶然发挥作用。这与偶数或奇数元素无关。
在void alloc(char ***p)
函数中,为指向char:k
的指针的char**
指针分配内存。然后用新的有效k
指针填充所有char*
指针,即它们都不是NULL。在void foo(char **a)
的后期,您for(i=0; a[i] != NULL; ++i)
;由于a[k - 1]
非空,它将正确迭代它们。但是, a[k]
可能或可能不是NULL 之后,您永远不知道那里有什么。访问超出您分配的数组的内容是未定义的行为(由于超出访问权限)。
制作k + 1
元素并将k th 元素设置为NULL使这个工作;确保释放所有k + 1
元素并且不泄漏最后sentinal element。
既然你告诉宏中的代码工作正常,我就忽略了;不知道那里是否还有UB。如果你正在做这个练习来学习,那很好。如果您计划进行其他项目,请尝试重用已经提供这些功能的现有C库。