2011-05-15 82 views
2

我做了这个功能:C字符串问题

char** parse_cmd(const char* cmdline) { 
    int i; 
    int j = 0 ,k = 0; 
    char ch[100][100]; 
    for(i=0; i<strlen(cmdline); i++) { 
     if(cmdline[i] != ' ') { 
      ch[j][k] = cmdline[i]; 
      k++; 
     } else { 
      j++; 
      k = 0; 
     } 
    } 

    return ch; 
} 

但是,当我编译程序我有这样的警告:

shell.c: In function ‘parse_cmd’: 
shell.c:25:2: warning: return from incompatible pointer type 
shell.c:25:2: warning: function returns address of local variable 

为什么?

+7

除了其他任何东西,你不能从这样的函数返回本地数组,或者甚至根本不能返回。 – 2011-05-15 17:06:15

回答

3

您尝试返回指向内存位置的指针,该位置在函数返回后不会与数组关联。如果你想永久分配内存,那么你必须在返回之前用malloc(或任何类似的函数)复制它。

e.g:

char** parse_cmd(const char* cmdline) { 
int i; 
int j = 0 ,k = 0; 
char **ch = (char**)malloc(100*100); 
for(i=0; i<strlen(cmdline); i++) { 
    if(cmdline[i] != ' ') { 
     ch[j][k] = cmdline[i]; 
     k++; 
    } else { 
     j++; 
     k = 0; 
    } 
} 
return ch; 
} 

编辑:固定错字。 Thanx

+0

'char ** ch'不是'char ch **'。你不能用'malloc'分配'char **'。 – 2011-05-15 17:12:52

+1

你可以,如果你投了,但这看起来像一个黑客,不是吗? :/ – Constantinius 2011-05-15 17:18:14

+1

不,你不能。解引用'char **'会给出'char *'类型的值。它期望指向某个地方。你需要a)分配一个char(*)[100]',b)做一个循环来分配每一行,或者c)把它改成'char *'并通过乘法手动索引,例如'ch [i * 100 + j]'而不是'ch [i] [j]'。 – 2011-05-15 17:23:08

3

你正在返回一个指向栈上内存的指针。改为使用堆分配的内存。

2

ch数组在函数结束时被释放,该函数返回后,该内存被存储在堆栈中,该堆栈无效。你应该在调用函数中创建一个数组,并将指针传递给parse_cmd()函数。

+1

+1,但也应该注意'char [N] [O]'不衰减到'char **',而是衰减到'char(*)[O]'。 – 2011-05-15 17:11:36