为什么我在函数结束时出错?

时间:2018-06-17 14:05:55

标签: c

我参与我的C教程。

我有这个功能:

void sortString(char c[][5], int size) {
    char temp[] = "";

    for (int i = 0; i < size - 1; i++)
    {
        for (int j = 0; j < size - 1; j++)
        {
            if (strcmp(c[j],c[j+1]) > 0) //arr + j
            {
                strcpy(temp, c[j]);// only strcpy, assignment not works
                strcpy(c[j], c[j + 1]);
                strcpy(c[j + 1], temp);
            }
        }
    }
}

外部循环结束后,当函数结束时,我收到此错误:

Run-Time Check Failure #2 - Stack around the variable 'temp' was corrupted. 

知道为什么我上面会出错吗?

3 个答案:

答案 0 :(得分:1)

您提到的代码几乎没有观察到。 首先,这里

export class StockService { apiUrl = "http://localhost:5001/api/values"; constructor(private http: HttpClient) { } getStocksResources(): Observable<DbObject[]> { return this.http.get<DbObject[]>(this.apiUrl + "/stocks"); } buyStock(data: DbObject){ return this.http.post<DbObject>(this.apiUrl + "/quantity", data); } }

char temp[] = "";尺寸太小,无法容纳temp。使它更大,以便它可以容纳c[j]。例如

c[j]

其次,冒泡排序内部char temp[5] = "";循环迭代不正确。而不是for使用j < size - 1

答案 1 :(得分:0)

您没有足够的缓冲区存储作为临时变量。您将需要知道给定字符串的max_length并在堆栈上分配足够的内存。如果您不知道这一点,那么另一个选项是堆上的动态分配。

答案 2 :(得分:0)

temp []的这个定义用一个char(byte)0初始化它。当你复制c [j]时,你将c [j]的所有字节复制到内存,从temp开始。如果c [j]有超过1个字符,则不会覆盖不属于temp的额外内存,并且可能是该函数的本地堆栈帧。

编译器会在调试模式和报告中对此进行检查 - 请参阅Run-Time Error ChecksStack Allocation中的详细信息。

如果你在堆栈上分配太多,你会发现堆栈溢出!