該樓層疑似違規已被系統折疊?隱藏此樓查看此樓
6、free()函數
問:下面的程序會在用戶輸入’freeze’的時候出問題,而’zebra’則不會,為什么?
#include int main(int argc, char *argv[]) {
char *ptr = (char*)malloc(10);
if(NULL == ptr)
{
printf("\n Malloc failed \n");
return -1;
}
else if(argc == 1)
{
printf("\n Usage \n");
}
else
{
memset(ptr, 0, 10);
strncpy(ptr, argv[1], 9);
while(*ptr != 'z')
{
if(*ptr == '')
break;
else
ptr++;
}
if(*ptr == 'z')
{
printf("\n String contains 'z'\n");
// Do some more processing }
free(ptr);
}
return 0; }
答:這里的問題在于,代碼會(通過增加“ptr”)修改while循環里“ptr”存儲的地址。當輸入“zebra”時,while循環會在執行前被終止,因此傳給free()的變量就是傳給malloc()的地址。但在“freeze”時,“ptr”存儲的地址會在while循環里被修改,因此導致傳給free()的地址出錯,也就導致了seg-fault或者崩潰。
7、*和++操作
問:下面的操作會輸出什么?為什么?
#include int main(void) {
char *ptr = "Linux";
printf("\n [%c] \n",*ptr++);
printf("\n [%c] \n",*ptr);
return 0; }
答:輸出結果應該是這樣:
[L] [i]
因為“++”和“*”的優先權一樣,所以“*ptr++”相當于“*(ptr++)”。即應該先執行ptr++,然后才是*ptr,所以操作結果是“L”。第二個結果是“i”。