為什么這樣有效:
#include <stdio.h>
void slice(char *st, int m, int n)
{
int i = 0;
while ((i m) < n)
{
st[i] = st[i m];
i ;
}
st[i-1] = '\0';
}
int main()
{
char st[] = "Hello";
slice(st, 1, 6);
printf("The value of string is %s\n", st);
return 0;
}
這不會:
#include <stdio.h>
void slice(char *st, int m, int n)
{
int i = 0;
while ((i m) < n)
{
st[i] = st[i m];
i ;
}
st[i-1] = '\0';
}
int main()
{
char*st = "Hello";
slice(st, 1, 6);
printf("The value of string is %s\n", st);
return 0;
}
首先,我使用以下方法初始化了我的字串:
char st[]="Hello";
(使用陣列)
在后者中,我使用了:
char*st="Hello";
(使用指標)
我對這兩種初始化型別感到困惑,通過 usingchar st[]="Hello";
和 using宣告字串之間的主要區別是什么char*st = "Hello";
。
uj5u.com熱心網友回復:
,char st[] = "Hello";
是st[]
一個可修改的字符陣列。該呼叫slice(st, 1, 6);
獲取陣列st
并轉換為指向陣列第一個元素的指標。 slice()
然后接收那個指標,一個指向可修改字符的指標。
char *st = "Hello";
其中 ,是st
一個指向字串文字 "Hello"
的指標。通過 call slice(st, 1, 6);
,函式接收指標的副本 - 指向字串文字的指標。在內部slice()
,代碼st[i] = ...
試圖修改字串文字,即未定義行為(UB)。它可能有效,它可能失敗,它可能今天有效,明天失敗——它沒有被定義。
不要嘗試修改字串文字。
...將字串傳遞給函式...
在這兩種情況下,代碼都不會將字串傳遞給slice()
,而是將指標傳遞給字串。了解這種微妙的區別有助于理解真正發生的事情。
uj5u.com熱心網友回復:
這是 C 中舊語法的產物:
char * s = "Hello world!";
是指向const記憶體的非常量字符指標。語法仍然允許它,但字串仍然不是可變物件。為了迂腐,它真的應該寫成:
const char * s = "Hello world!";
相比之下:
char s[] = "Hello world!";
分配一個本地(在堆疊上)可變陣列并將字串資料復制到它(從非可變副本存盤在記憶體中的任何位置)。然后,您的函式可以根據需要對字串的本地副本執行操作。
uj5u.com熱心網友回復:
char [] 型別與 char* 型別不同(char* 是一個變數 - int。但 char[] 是一個不是變數的陣列)。但是,陣列名可以用作指向陣列的指標。所以我們可以說 st[] 在技術上類似于 *str 。
第二版代碼中的問題
如果您有只讀字串,那么您可以使用 const char* st = "hello";
或簡單地使用char* st = "hello";
. 所以字串很可能存盤在只讀記憶體位置,您將無法修改它。但是,如果您希望能夠修改它,請使用 malloc 函式:
char *st= (char*) malloc(n*sizeof(char)); /* n-The initial size that you need */
// ...
free(st);
**所以要為 分配記憶體st
,計算字符數 ("hello"-strlen(st)=5) 并為這個終止的空字符加 1,像 scanf 和 strcpy 這樣的函式將添加空字符;
所以代碼變成:
#include <stdio.h>
void slice(char *st, int m, int n)
{
int i = 0;
while ((i m) < n)
{
st[i] = st[i m];
i ;
}
st[i-1] = '\0';
}
int main()
{
char *st =malloc(6*sizeof(char)) ;
const char *cpy="hello";
strcpy(st, cpy); /* copies the string pointed by cpy (including the null character) to the st. */
slice(st, 1, 6);
printf("The value of string is %s\n", st);
return 0;
}
您也可以通過 for 回圈或 scanf() 填充您的字串。
在大量分配的情況下,您必須以
free(st);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/470470.html
上一篇:為什么結構的free()會導致段錯誤(錯誤使用指標)?
下一篇:布爾變數始終等于false