[問題] 幾個除錯問題

作者: wind137 (布穀密語)   2018-07-23 13:58:30
各位好
最近在自學C語言
有學長給我了他之前去面試時的考題 不過我們都是程式菜逼八
題目主要為找出程式碼中有錯誤的地方
有些看不太懂哪邊有問題 要煩請各位大大解答了 謝謝
1.
void test()
{
char a[32];
char b[48];
read(0,a,sizeof(a));
strcpy(b,a);
}
2.
char* fun();
void test
{
char *buf;
int len;
buf = fun();
len = strlen(buf);
buf[len-1] = '\0';
}
3.
int test(char *buffer)
{
char tmpline[256], *line;
if (buffer == NULL)
return 0;
memset(tmpline, 0, sizeof(tmpline));
line = strncpy(tmpline, buffer, sizeof(tmpline));
if (line == NULL)
return 0;
line[strlen(line)] = 0;
return 1;
}
4.
typedef struct list
{
char * next;
} list;
typedef struct z
{
list l;
} z;
void test()
{
z *x = malloc (sizeof(z));
if (!x)
return;
x->l.next=1;
free(x->l.next);
}
5.
c假設為>=0的整數
void test()
{
char *x = “0123456789”;
if (c)
x = malloc(1);
free(x);
}
這題run過程式後是free(x)這邊出現error
是因為一開始指標字串x與後面分配的記憶體不一致嗎?
6.
int *test(unsigned int n)
{
int aux;
int *p;
if (n == 1)
{
p = &aux;
}
else
{
p = (int *)malloc(n * sizeof(int));
}
return p;
}
此題是否為置底13誡的第5題那樣
在函式中回傳一個指向區域性自動變數的指標會失效?
以上幾題百思不得其解 麻煩各位大大為蔡逼八解惑了
感謝!!
作者: sarafciel (Cattuz)   2018-07-23 14:13:00
只丟程式碼誰曉得你的考題是要考什麼東西XD
作者: wind137 (布穀密語)   2018-07-23 14:15:00
抱歉 題目主要是找出一小段程式碼裡面可能邏輯錯的地方
作者: sarafciel (Cattuz)   2018-07-23 14:43:00
123都是空字元的問題 str系列函數掃到空字元才會停strn系列則是掃到第n個字元才會停所以像第一題 如果我在a輸入36個非空字元在strcpy的時候就會因為掃不到空字元超過邊界第四題他直接把1塞給next然後再free當然炸掉第五題c=0時條件式不會進 你就會free到rodata 然後炸掉第六題就跟你講的一樣 不過指到區域變數的指標不會失效而是很高機率在執行過程中因為stack增減導致值被蓋掉
作者: wind137 (布穀密語)   2018-07-23 16:03:00
感謝cutekid大大與sarafciel大大的指點!

Links booklink

Contact Us: admin [ a t ] ucptt.com