我嘗試了 2 種不同的方法來構建一個函式,該函式接受來自用戶的字串輸入并將其存盤在一個變數中。
實施 A
char* input(size_t size)
{
char buffer[size];
char* str = (char*)malloc(sizeof(char) * sizeof(buffer));
if (fgets(buffer, size, stdin) != NULL)
{
buffer[strcspn(buffer, "\n")] = '\0';
printf("Buffer says: %s\n", buffer);
strncpy(str, buffer, sizeof(buffer));
str[sizeof(buffer) - 1] = '\0';
printf("str inside function says: %s\n", str);
return str;
}
return NULL;
}
實施 B
int input2(char* str, size_t size)
{
char buffer[size];
str = (char*)malloc(sizeof(char) * sizeof(buffer));
if (fgets(buffer, size, stdin) != NULL)
{
buffer[strcspn(buffer, "\n")] = '\0';
printf("Buffer says: %s\n", buffer);
strncpy(str, buffer, sizeof(buffer));
str[sizeof(buffer) - 1] = '\0';
printf("str inside function says: %s\n", str);
return 0;
}
return -1;
}
主.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "libs/custom/myio.h"
int main(int argc, char const *argv[])
{
char *ip1;
ip1 = input(1000);
printf("ip1 inside main says %s\n", ip1);
free(ip1);
char* ip2;
input2(ip2, 1000);
printf("ip2 inside main says %s\n", ip2);
free(p2);
return 0;
}
運行程式時:
Hi # user input
Buffer says: Hi
str inside function says: Hi
ip1 inside main says Hi
Hi # user input
Buffer says: Hi
str inside function says: Hi
ip2 inside main says (null)
A作業得很好,但B沒有。A不是我想要使用的方法,我更喜歡使用B。
當我嘗試使用 valgrind 和 gdb 進行除錯時,它似乎正在檢測printf函式中的錯誤 (??)。
==177193== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
==177193==
==177193== 1 errors in context 1 of 2:
==177193== Conditional jump or move depends on uninitialised value(s)
==177193== at 0x48D71C2: __vfprintf_internal (vfprintf-internal.c:1688)
==177193== by 0x48C1EBE: printf (printf.c:33)
==177193== by 0x109276: main (main.c:19)
==177193== Uninitialised value was created by a stack allocation
==177193== at 0x109209: main (main.c:7)
==177193==
==177193== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
我已經做了很多研究,但我仍然不知道為什么B不起作用。
uj5u.com熱心網友回復:
函式input2(“實施 B”)中的問題是該行
str = (char*)malloc(sizeof(char) * sizeof(buffer));
只會修改函式中的指標變數str,其中包含函式中input2變數值的副本。它不會在函式中設定原始變數的值。ip2mainip2main
如果您希望變數ip2受到這行代碼的影響,那么,您應該通過將函式的引數更改為以下內容,而不是將變數的值傳遞ip2給函式input2,而是傳遞一個指向該變數的指標:
int input2( char** str, size_t size )
并通過更改線路
str = (char*)malloc(sizeof(char) * sizeof(buffer));
到:
*str = (char*)malloc(sizeof(char) * sizeof(buffer));
現在,當在 中呼叫函式input2時,您應該傳遞該變數的地址,而不是傳遞 的值,如下所示main:ip2
input2( &ip2, 1000 );
現在,這個變數也應該受到函式變化的影響input2。
此外,值得注意的是,在 C 中(與 C 相比),沒有必要強制轉換malloc. 請參閱此問題以獲取更多資訊:我是否會轉換 malloc 的結果?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/419660.html
標籤:
上一篇:修復分段錯誤
下一篇:為什么我要使用列舉作為型別?
