[英]C Pass by reference string
我想修改函數內部的字符串。 我的代碼非常簡單:
#include <stdio.h>
void doSomething ( char **string )
{
sprintf(string,"some string");
}
int main ( void )
{
char *origString = NULL;
doSomething ( &origString );
printf ( "%s\n", origString );
return 0;
}
但是這段代碼不起作用。 我真的很感激解釋而不是解決方案,但也歡迎解決方案。
我真的需要使用sprintf函數,因為想法是用%s添加一些其他字符串。
謝謝!
解決了!
#include <stdio.h>
void doSomething ( char **string )
{
*string = malloc(strlen("some string") + 1);
sprintf(*string,"some string");
}
int main ( void )
{
char *origString = NULL;
doSomething ( &origString );
printf ( "%s\n", origString );
free(origString); // Previously malloced in doSomething
return 0;
}
sprintf
將char*
作為其第一個參數,而不是char**
,因此它應該是sprintf(*string,"some string");
。 但是*string
在此時將為NULL
,因此仍然無效。
如果希望字符串的內存由doSomething
函數分配,則需要在該函數中分配內存。 sprintf
不會為你分配任何內存。 因此,在調用sprintf
之前,您需要使用malloc
分配內存,並使*string
指向該內存。 您還應該知道,您的功能用戶需要在完成內存后釋放內存。
這應該工作
#include <stdio.h>
void doSomething ( char *string )
{
sprintf(string,"some string");
}
int main ( void )
{
char origString[200];
doSomething ( origString );
printf ( "%s\n", origString );
return 0;
}
這會傳入一個指向字符串中第一個字符的指針(200個字符的數組)。 然后可以修改此數組的內容。
編輯
使用malloc
#include <stdio.h>
void doSomething ( char **string )
{
const char * const x = "Some string ksdskjkj";
*string = malloc(strlen(x) + 1 /* For the null characcter */); // Now origString will also point to this dynamic memory
sprintf(*string,"some string");
}
int main ( void )
{
char *origString = NULL;
doSomething ( &origString );
printf ( "%s\n", origString );
free(origString); // Previously malloced in doSomething
return 0;
}
Ed Heal的解決方案是正確的,但為了使其與您最初的工作方式保持一致,您可以使用此方法獲得相同的結果(盡管有一些警告取決於您的編譯器設置):
#include <stdio.h>
void doSomething ( char **string )
{
sprintf(string,"some string");
}
int main ( void )
{
char * origString[200];
doSomething ( origString );
printf ( "%s\n", origString );
return 0;
}
在C字符串中字面上是字符數組。 您試圖將空指針傳遞給doSomething()。 doSomething(char ** string)將一個地址帶到一個char指針,因此你不需要傳遞origString的地址(即&origString)。 您所需要的只是通過doSomething(origString)傳遞去引用的指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.