D 为什么要使用&x27;s的return语句不是通常的int[]

D 为什么要使用&x27;s的return语句不是通常的int[],d,D,我刚刚开始使用Dlang,它似乎非常适合希望使用更安全的C语言的人。此外,它还具有类似函数式编程的现代范例 我正在尝试以下代码将数字列表作为字符串转换为整数列表: import std.stdio; import std.array; import std.conv; int[] list_str2int(char[][] slist){ // this function should convert a list of numbers as char[] to integers

我刚刚开始使用Dlang,它似乎非常适合希望使用更安全的C语言的人。此外,它还具有类似函数式编程的现代范例

我正在尝试以下代码将数字列表作为字符串转换为整数列表:

import std.stdio; 
import std.array;
import std.conv;

int[] list_str2int(char[][] slist){     // this function should convert a list of numbers as char[] to integers
    int[100] intcol; 
    int N = cast(int)slist.length; 
    foreach(int i; 0..N){
        char[] temp = slist[i];
        temp = split(temp, ".")[0];   // effectively this is floor; to!int does not work if '.' is there; 
        intcol[i] = to!int(temp);   // not working; 
    }
    return intcol;                  // error from this statement; 
}

void main(){
    char[][] strlist = cast(char[][])["1.1","2.1","3.2","4.4"]; 
    int[] newintlist = list_str2int(strlist); 
    writeln("Converted list: ", newintlist); 
}
但出现以下错误:

testing.d(13): Error: returning cast(int[])intcol escapes a reference to local variable intcol
Failed: ["/usr/bin/dmd", "-v", "-o-", "testing.d", "-I."]
我无法理解为什么变量为int[]的第一个函数的返回行出现错误


问题在哪里?如何解决?感谢您的帮助。

int[100]
是一个静态数组(一种值类型),位于
列表的堆栈框架上-因此,一旦函数返回,它将不再存在。函数的返回值,
int[]
,是一个切片(一种引用类型),它不保存任何数据,但引用内存中某个位置的连续整数数。语句
返回intcol获取静态数组的一个片段,但是,返回该片段是无效的,因为该片段将指向在函数返回后不再有效的内存

您有几个选择:

  • 将返回类型也声明为
    int[100]
    。使其成为值类型,整数将被复制到调用方的堆栈帧

  • 通过将数组声明并初始化为
    auto intcol=new int[100],在程序堆中分配数组。这将使
    intcol
    成为堆中的内存片。堆中的内存由垃圾收集器拥有,并且有效地具有无限的生存期

  • 一个比上面更进一步但对现代D更惯用的选项是使用范围。您的程序可以重写为一条语句,如下所示:

    import std.algorithm.iteration;
    import std.stdio; 
    import std.array;
    import std.conv;
    
    void main()
    {
        ["1.1", "2.1", "3.2", "4.4"]
            .map!(item => item
                .split(".")[0]
                .to!int
            )
            .array // optional, writeln and co can write ranges
            .writefln!"Converted list: %s";
    }
    

int[]
是一个片,它可以使用动态分配

int[100]
是由100个元素组成的数组。它是在堆栈上分配的

就像在C语言中一样,不能从函数返回本地内存,也不能返回
intcol
,因为函数返回后,它后面的内存将变得无效

如果要使用动态数组或静态数组,我似乎不知道。如果您想使用动态数组,那么请坚持使用它们

import std.stdio; 
import std.array;
import std.conv;

int[] list_str2int(char[][] slist){     // this function should convert a list of numbers as char[] to integers
    int N = cast(int)slist.length; 
    int[] intcol = new int[N];
    foreach(int i; 0..N){
        char[] temp = slist[i];
        temp = split(temp, ".")[0];   // effectively this is floor; to!int does not work if '.' is there; 
        intcol[i] = to!int(temp);   // not working; 
    }
    return intcol;                  // error from this statement; 
}

void main(){
    char[][] strlist = cast(char[][])["1.1","2.1","3.2","4.4"]; 
    int[] newintlist = list_str2int(strlist); 
    writeln("Converted list: ", newintlist); 
}
将输出:

 Converted list: [1, 2, 3, 4]

我只想使用动态数组。
int[]是一个动态数组,它使用malloc和realloc以及free来管理内存。
此语句在两个级别上是错误的:1)D片没有直接绑定到任何内存管理机制。2) 导致内存分配操作的D片操作通过D运行时和垃圾收集器,而不是
malloc
/etc。很好的选项。惯用的方式是最好的。