如何在C中查找动态2D字符数组中的行数?
那里什么都没有。
尝试使用以下代码
#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 = %dn", i);
}
void strcpyo(char* a, char*b){
int i=0;
for(i=0;b[i]!=' ';i++){
a[i]=b[i];
}
a[i]=' ';
}
void strcpym(char* a, char*b){
int i=0;
for(i=0;b[i]!=' ';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**)
中创建数组,则会对数组中奇数行给出错误的答案。有人能解释为什么吗?
即。对于CCD_ 4给出错误答案,而对于even number
给出正确答案。
您的代码依赖于未定义的行为才能正确工作,即它只能偶然工作。这与元素的偶数或奇数计数无关。
在void alloc(char ***p)
函数中,您为k
指针分配内存,该指针指向字符:char**
。然后用新的有效char*
指针填充所有k
指针,即它们都不是NULL。稍后在void foo(char **a)
中执行for(i=0; a[i] != NULL; ++i)
;由于a[k - 1]
是非null的,它将正确地对它们进行迭代。但在那之后a[k]
可能是空的,也可能不是空的,您永远不知道里面有什么。访问您分配的数组之外的内容也是未定义的行为(由于越界访问)。
生成k + 1
元素并将第k个元素设置为NULL使其起作用;确保释放了所有k + 1
元素,并且没有泄漏最后一个重要元素。
既然你告诉我宏中的代码运行良好,我就忽略了这一点;不知道那里是否也有UB。如果你做这个练习是为了学习,那没关系。如果你打算做一些其他的项目,试着重用一些已经提供了这些功能的现有C库。