我的印象是,因爲我傳遞了一個指向該函數的指針,它將通過引用處理該參數。事實上,這是我在課堂上教過的。任何見解都可以幫助。
有沒有由C.引用你們經過的每個參數是通過價值。
這樣:
void foo(int a) {
a = 21;
// a == 21 for the rest of THIS function
}
void bar(void) {
int x = 42;
foo(x);
// x == 42
}
也是一樣的:
static int john = 21;
static int harry = 42;
void foo(int * a) {
a = &john;
// a points to john for the rest of THIS function
}
void bar(void) {
int * x = &harry;
foo(x);
// x still points to harry
}
如果你想通過參數來改變一個指針,那麼你需要一個指針傳遞到指針:
static int john = 21;
static int harry = 42;
void foo(int ** m) {
*m = &john;
}
void bar(void) {
int * x = &harry;
foo(&x); // passing the address of x by value
// x now points to john
}
我還在做什麼錯了,比如調用realloc t很多次?
printf(prompt);
安全問題:嘗試之類的東西"%s"
爲prompt
值。更好地使用puts
或printf("%s", prompt)
。
do { string = (char*)malloc(sizeof(char)); } while (string == NULL);
這是一個可能的無限循環。如果malloc
失敗,再次立即調用它不會改變任何東西。另外:不要投的malloc
返回值。此外被sizeof(char)
定義爲等於1
。
int index = 0;
對於指數使用size_t
。
char place = getchar();
還有一個原因getchar
返回int
,即能檢查EOF
,你...
while (place != '\n')
...不這樣做,而是應該!
string = (char*)realloc(string, sizeof(string) + sizeof(char));
不要將返回值,sizeof(string)
是不是做你認爲是這樣,它是一個編譯時間常數(可能是64位系統上8
)。
if (string == NULL) return false;
內存泄漏,因爲......
如果沒有足夠的內存,舊內存塊不被釋放,並返回空指針。
[Source]
以下是我讀到在C線:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
char * readline(char const * const prompt) {
char buffer[10];
char * string = malloc(1);
if (string == NULL) {
return NULL;
}
// The accumulated length of the already read input string.
// This could be computed using strlen, but remembering it
// in a separate variable is better, performancewise.
size_t accumLength = 0;
string[0] = '\0';
printf("%s", prompt);
while (fgets(buffer, 10, stdin) != NULL) {
// To see what has been read in this iteration:
// printf("READ: |%s|\n", buffer);
// Compute the length of the new chunk that has been read:
size_t const newChunkLength = strlen(buffer);
// Try to enlarge the string so that the new chunk can be appended:
char * const newString = realloc(string, accumLength + newChunkLength + 1);
if (newString == NULL) {
free(string);
return NULL;
}
string = newString;
// Append the new chunk:
strcpy(string + accumLength, buffer);
accumLength += newChunkLength;
// Done if the last character was a newline character
assert(accumLength > 0);
if (string[accumLength - 1] == '\n') {
// NOTE: Wasting 1 char, possible solution: realloc.
string[accumLength - 1] = '\0';
return string;
}
}
// EOF is not an error!
if (feof(stdin)) {
return string;
}
free(string);
return NULL;
}
int main(int argc, char ** argv) {
char const * const input = readline(">");
printf("---\n%s\n---\n", input);
return 0;
}
嗯'do {string =(char *)malloc(sizeof(char)); } while(string == NULL);'看起來像一個潛在的不定式循環。更好地返回錯誤指示。 – chux
'bool get_string(char prompt [],char * string)'的調用者永遠不會看到分配的'string'的值。 ('string'按值傳遞,而不是引用) – chux
'sizeof(string)'不會做你認爲它的作用。 – aschepler