2013-04-22 51 views
1

我正在将一个多维字符数组传递给c中的函数。 main()或其他函数确定输入数组的大小(尺寸)。我想在我的函数中动态地确定数组的长度和宽度。到目前为止,我已经能够为第一行动态确定宽度。但是,如果我尝试使用相同的逻辑来确定长度,则会出现访问冲突错误。这是我到目前为止的代码:c char **导致分配错误

char * myfunc(char* in[]) 
{ 
    int index=0, cols=0; 
    while(in[0][index++] != '\0'); 
    cols = index - 1; 
    : 
    : 
} 

int main() 
{ 
    char *in[3] = {"abcd","efgh","ijkl"}; 
    char *out = myfunc(in); 
    : 
    : 
} 

对我来说幸运的是,**中所有'行'中的'cols'是相等的。我知道更强大的方法是首先确定行数,然后测试每行后面的列数。每当我尝试为行执行类似操作时,我都会导致访问冲突错误。

我应该提到,我无法重新定义传递数组维数的函数。我还应该提到,这不是作业或工作,我刷过C编码技能时遇到了这个问题。有没有一种方法可以确定上述情况下的行数而不会导致访问冲突错误?

+0

对于初学者来说,这应该是'const char * in [3]'。这些是字面常量。所以你的参数声明也应该如此。 – WhozCraig 2013-04-22 16:16:15

+0

我真的不控制调用这个函数的函数。这是一个挑战。 – BigLib 2013-04-22 18:15:06

+0

你不需要控制调用者。调用者可以传递非常量字符串(如果他们想要的话)。但除非你打算修改它们,或者将它们传递给一个函数,否则没有理由*不*要在这里将传入的指针*声明为const。来电者会很好。反过来说(调用者用'const'指针调用,而你需要非const),你会遇到问题,但我在这里看不到这种情况。 – WhozCraig 2013-04-22 18:57:52

回答

0
char * myfunc(char* in[]) 
{ 
    int rows; 
    for(rows = 0; in[rows]; ++rows) 
     ; 
    printf("%d\n", rows); 

    ..... 
    ..... 
} 

int main() 
{ 
    char *in[] = {"abcd",, "efgh","ijkl", NULL}; 
    char *out = myfunc(in); 
} 

只有当所有字符串的长度相同时,才值得检测列。

+0

我确实接受了你的建议 - 添加了NULL并为(rows = 0;在[rows]; ++ rows)中执行以获得正确的结果。然后我确定每行的宽度是否相同 - 一个要求。 但是,我也试过(行= 0;在[行]; ++行),而不使用NULL。有趣的是,对于我的原始输入 - {“abcd”,“efgh”,“ijkl”}行count = 10。如果我将“mnop”添加到输入数组中,rows = 11,则添加“qrst”使rows = 13。我改变了“abc”,依此类推,我仍然得到相同的结果。任何想法,为什么会发生这种情况? – BigLib 2013-04-22 18:28:08

+0

@BigLib - for循环在找到NULL(0)时停止。它随机发生在第10元素或第11元素,因此它停在那里。然而,你进入了未定义行为的区域,因此应该避免。当且仅当最后一个元素初始化为NULL时,才应使用for循环。 – user93353 2013-04-22 18:30:53

+0

是的,我只是不断尝试新的投入,看看行为是否持续。我改变了每行中的字符数 - 列数。该关系似乎只与行数成正比。它似乎并不随意。但我必须同意你的看法。我至多得到了这种行为的轶事证据。感谢您的帮助。 – BigLib 2013-04-22 18:48:11

2

对于您拥有的数据,无法完成。但是,你可以添加一个前哨这样的:

char *in[4] = {"abcd", "efgh", "ijkl", NULL}; 

,然后寻找前哨(这是你在做什么有效数列,通过查找定点'\0'第一个字符串中)。

+0

谢谢,NULL检测器工作。 – BigLib 2013-04-22 18:15:31