[疑难] 请教char[]问题

my3world 2008-10-22

系统:ubuntu8.04 gdc (GCC) 4.2.4 20080519 (prerelease gdc 0.25 20071215, using dmd 1.022) (Ubuntu 0.25-4.2.4-1ubuntu1)
代码:
import std.stdio;
void main() {
    char[] s="World!";
    s = "Hello";
    writefln(s);
    s[0]='h';
}
编译通过,运行时出现:
Hello
段错误
s是一个字符数组,不明白为什么不能用s[0]。

import std.stdio;
void main() {
    char[] s="World!";
    s = "Hello";
   writefln(s[0]);
}
能正确地显示
H
所以应该是s[0]不能赋值,char[]s定义了一个常量?可是s又可以赋值。还是s直接指向了"World!"所在的内存?而s="Hello"只不过是重新指向"Hello"所在的内存?
如果是这样的话,那char[] s也不过是定义了一个指针,而不是一个数组吧?

 

ideage 2008-10-22
xp,dmd1.031,没有错误.可以运行.
my3world 2008-10-22
感谢ideage兄
那应该是编译器不同出的问题了。
我的是“using dmd 1.022”。
Colorful 2008-10-22
请注意 DMD 编译器在 Linux 和 Windows 上的区别。

不论是 D 1.0 还是 D 2.0,查看官方文档,都可以发现这句话:

引用
Differences between Windows and Linux versions
String literals are read-only under Linux. Attempting to write to them will cause a segment violation.
my3world 2008-10-23

感谢Colorful 兄,那我需要做一个转换难道要重新构建一个char[]?

拼命地下载不同版本的时候Colorful 送来了答案,万分感谢!

my3world 2008-10-23
语言底层的代码居然会因为系统的不同而出现错误,好像让人有点失望。一门好的高级语言不应该是与平台无关的吗?
store88 2008-10-24
my3world 写道
语言底层的代码居然会因为系统的不同而出现错误,好像让人有点失望。一门好的高级语言不应该是与平台无关的吗?

有人说平台无关是我们太天真,JAVA的跨平台不过是一厢情愿,只不过运行依靠的RUNTIME是不一样的而已,Dlang也一样
oldrev 2008-10-24
my3world 写道

系统:ubuntu8.04 gdc (GCC) 4.2.4 20080519 (prerelease gdc 0.25 20071215, using dmd 1.022) (Ubuntu 0.25-4.2.4-1ubuntu1)
代码:
import std.stdio;
void main() {
    char[] s="World!";
    s = "Hello";
    writefln(s);
    s[0]='h';
}
编译通过,运行时出现:
Hello
段错误
s是一个字符数组,不明白为什么不能用s[0]。

import std.stdio;
void main() {
    char[] s="World!";
    s = "Hello";
   writefln(s[0]);
}
能正确地显示
H
所以应该是s[0]不能赋值,char[]s定义了一个常量?可是s又可以赋值。还是s直接指向了"World!"所在的内存?而s="Hello"只不过是重新指向"Hello"所在的内存?
如果是这样的话,那char[] s也不过是定义了一个指针,而不是一个数组吧?

 

字符串常量是指针,因为编译时长度可知,不需要数组类型的长度分量。

 

修改字符串常量行为本身是错误的做法,按 C 和 C++ 标准的说法叫“未定义行为”,这跟跨不跨平台没关系,也怨不着 D 的事

hqs7636 2008-10-24
oldrev 对细节的态度实在佩服
my3world 2008-10-25
oldrev 写道
my3world 写道

系统:ubuntu8.04 gdc (GCC) 4.2.4 20080519 (prerelease gdc 0.25 20071215, using dmd 1.022) (Ubuntu 0.25-4.2.4-1ubuntu1)
代码:
import std.stdio;
void main() {
    char[] s="World!";
    s = "Hello";
    writefln(s);
    s[0]='h';
}
编译通过,运行时出现:
Hello
段错误
s是一个字符数组,不明白为什么不能用s[0]。

import std.stdio;
void main() {
    char[] s="World!";
    s = "Hello";
   writefln(s[0]);
}
能正确地显示
H
所以应该是s[0]不能赋值,char[]s定义了一个常量?可是s又可以赋值。还是s直接指向了"World!"所在的内存?而s="Hello"只不过是重新指向"Hello"所在的内存?
如果是这样的话,那char[] s也不过是定义了一个指针,而不是一个数组吧?

 

字符串常量是指针,因为编译时长度可知,不需要数组类型的长度分量。

 

修改字符串常量行为本身是错误的做法,按 C 和 C++ 标准的说法叫“未定义行为”,这跟跨不跨平台没关系,也怨不着 D 的事

oldrev兄,我并不是干点修改字符串常量什么的事,我要修改的是我自己定义的char[]数组里面的一个元素的值。难道我写了char[] x = "Hello"; 这句不应该是指定一个数组来让我存放、修改数据,而是弄了一个char指针来指向一个字符串常量?

 

我的确说错了一点,在linux和windows下都能编译通过说明语言本身没有问题,运行时错误是应该是编译器的实现问题。对不起了。

附上:为什么这么多个版本都没有改正呢?

 

Global site tag (gtag.js) - Google Analytics