藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 http://www.lslnet.com 2006年6月6日 10:18


C指針方面: 是否可以修改指針所指向的字符串中的單個字符?

程序如下:
main()
{
    char s[] = "abcd";
    char *t = "1234";

    s[3] = 'a';
    *(t + 3) = 'a';

    printf("s is %s", s);
    printf("t is %s", t);

    return 0;
}
我用redhat Linux 9 中的gcc編譯時沒有報錯, 運行out文件時報"段錯誤",程序終止.
將*(t + 3) = 'a';註釋掉後, 程序正常運行.
我查了一下<C程序設計>;第88頁, 寫到:對於指針指向的字符串,"如果試圖修改字符串的內容, 結果將不確定". 我的理解是: 指針指向的字符串類似一個常量, 你可以修改指針,讓它指向不同的字符串, 但不可以修改字符串的內容.
如果是這樣, 對於strcpy()這樣的函數用指針應該怎麼實現?
程序如下:
#include <stdio.h>;

void strcpy(char *, char *);

main()
{
    char *s = "abcd";
    char *t = "1234";

    strcpy(s, t);

    printf("s is %s", s);
    printf("t is %t", t);

    return 0;
}

void strcpy(char *s, char *t)
{
    while (*s++ = *t++)
    ;
}
這段程序遇到同樣問題: 指針指向的字符串在子函數中無法被符值. 將s和t改為字符串數組後, 程序正常. 可是你怎麼能保證用戶傳遞的參數不是字符串指針呢?

C指針方面: 是否可以修改指針所指向的字符串中的單個字符?

s[3] = 'a' 不行嗎?
要不strncpy(&s[3], 'a', 1)

C指針方面: 是否可以修改指針所指向的字符串中的單個字符?

可能原因:

main()
{
char s[] = "abcd";
char *t = "1234";

...
}
"1234"是全局串常量, GCC放到保護地址,不許改動. 一動就CPU保護.
"abcd"乃棧常量,無保護.
用VC可能無問題, 用TC更沒有問題.

C指針方面: 是否可以修改指針所指向的字符串中的單個字符?

char *t = "1234";



t為指針變量,"1234"是常量,如果沒有給t分配空間就賦常量值給指針變量,可能會coredump。

C指針方面: 是否可以修改指針所指向的字符串中的單個字符?

先給字符指針申請空間,然後再賦值,後面要加\0字符,然後再進行修改,最後再用%s打印,最後記得FREE申請的空間.

C指針方面: 是否可以修改指針所指向的字符串中的單個字符?

直接修改指針指向的字符沒有問題

C指針方面: 是否可以修改指針所指向的字符串中的單個字符?

直接修改指針指向的字符沒有問題

C指針方面: 是否可以修改指針所指向的字符串中的單個字符?

原因:
main()
{
char s[] = "abcd";
char *t = "1234";

   t[1] = '0';      // 不行!!! 在GCC上
  s[1] = '0';     // keyi.
...
}
"1234"是全局串常量, GCC放到保護地址,不許改動. 一動就CPU保護.
"abcd"乃棧常量,無保護.

用VC可能無問題, 用TC更沒有問題.

C指針方面: 是否可以修改指針所指向的字符串中的單個字符?

摟主! 我編譯,運行都沒有錯啊!  也達到了想得到的結果啊!
我的運行環境是ibm的aix,   cc 編譯!!!!

C指針方面: 是否可以修改指針所指向的字符串中的單個字符?

這個帖子和昨天的一個帖子都是一個問題,一個是指向常量的指針,一個是指向變量的字符數組, 改變指針的指向肯定要受到系統保護,不允許修改。

C指針方面: 是否可以修改指針所指向的字符串中的單個字符?

嚴重同意思一克和東子的觀點

給t分配空間也沒有用處
因為"1234"是常量,已經預分配了空間
t="1234"是正確的
但是正因為是常量,所以當你試圖去修改他的時候就會出錯

反之,如果給t分配了空間,然後再
t="1234",當你試圖去修改他的時候也一樣出錯,因為和前面一樣,
t指向的還是常量。
與前面不同的是,你分配給t的空間再也找不回來了,
當你試圖free掉t的時候同樣會出錯。

除非你strcpy(t, "1234") ;

C指針方面: 是否可以修改指針所指向的字符串中的單個字符?

UNICORNS完全正確
UNICORNS 說:
反之,如果給t分配了空間,然後再
t="1234",當你試圖去修改他的時候也一樣出錯,因為和前面一樣,
t指向的還是常量。

C指針方面: 是否可以修改指針所指向的字符串中的單個字符?

錯誤語句:

*(t + 3) = 'a';

不能夠修改!

C指針方面: 是否可以修改指針所指向的字符串中的單個字符?

我覺得從理論上說,是可以修改的。
但是在實際情況下,和編譯器或者操作系統的實現有一定的關係。

C指針方面: 是否可以修改指針所指向的字符串中的單個字符?

char *t = "1234";

*(t+3) = 'a'; 在一些平台上是錯誤的,如GCC。
在VC上可能不錯,在TC上無所謂。

C指針方面: 是否可以修改指針所指向的字符串中的單個字符?

用下列代碼測試看看
[code]
#include <stdio.h>;

int main() {
    char a[] = "1234";
    char *b = "abcd";

    printf("length  of char a[] = %d\n", sizeof(a));
    printf("length  of char *b  = %d\n", sizeof(b));
    printf("address of char a[] = %x\n", a);
    printf("address of char *b  = %x\n", b);
}
[/code]

我的環境是sco 5.05,運行結果:
--------------------------------------------------
length  of char a[] = 5
length  of char *b  = 4
address of char a[] = 7ffff994
address of char *b  = 400600
-----------------------------------------------------

順便請問思一克:什麼編譯器檢查會比較嚴格呢?

C指針方面: 是否可以修改指針所指向的字符串中的單個字符?

我也說不好。你加上
b[1] = '3';
實驗一下在SCO常量串可否修改?

C指針方面: 是否可以修改指針所指向的字符串中的單個字符?

可以啊。

建議將
char *b = "abcd";
改為
const char *b = "abcd";
編譯器才會報錯。

C指針方面: 是否可以修改指針所指向的字符串中的單個字符?

思一克回答的很正確,同意!



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com