我已经盯着这个问题已经有一段时间了,我似乎找不到明显的解决方案,也找不到描述特定问题的词汇。我会尽力的:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
char** findWords(char** words, int wordsSize, int* returnSize) {
*returnSize = 15; //<- wordsSize and returnSize have the same memory address????
printf("wordsSize is %dn", wordsSize);
for(int i=0; i<wordsSize; i++)
{
printf("i: %d first word: %s, len: %dn", i, words[i], strlen(words[i]));
}
}
int main(void){
char **test; // this should be const char but func decl is predefined
test[0] = "Hello";
test[1] = "Alaska";
test[2] = "Dad";
test[3] = "Peace";
int *foo;
findWords(test, 4, foo);
printf("%d", *foo);
}
当findwords()被调用时,我看到&amp; wordssize and *returnsize是相同的(即它们具有相同的内存地址)
[New Thread 3492.0x9d0]
Breakpoint 1, findWords (words=0x7efde000, wordsSize=4, returnSize=0x28ff24) at keyboardrow.c:15
15 printf("wordsSize is %dn", wordsSize);
(gdb) print &wordsSize
$1 = (int *) 0x28ff24
(gdb) print returnSize
$2 = (int *) 0x28ff24
(gdb)
我错过了明显的东西吗?在我看来,&amp;单词大小和返回应该具有不同的内存地址,因为它们是两个单独的变量。
char **test; // this should be const char but func decl is predefined
test[0] = "Hello";
test[1] = "Alaska";
test[2] = "Dad";
test[3] = "Peace";
您无法做上面的事情。test
没有指向任何"有意义的"位置。
问题是
test[0] = "Hello";
test[1] = "Alaska";
test[2] = "Dad";
test[3] = "Peace";
所有这些调用不确定的行为,如test
,其本身并不指向A 有效内存。
在取消test
获取test[n]
之前,您需要确保test
指向有效的内存,该内存具有足够的大小以使test[n]
访问有效的内存。
而不是上述片段,您可以简单地写
char * test[] = { "Hello", "Alaska", "Dad", "Peace" };
并完成它。
由于您通过调用一个不指向任何地方的指针来调用未定义的行为相同的垃圾价值!