查找2D char数组中的行数

时间:2013-12-05 10:53:28

标签: c arrays multidimensional-array malloc

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正确。

1 个答案:

答案 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库。