我参与我的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.
知道为什么我上面会出错吗?
答案 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 Checks和Stack Allocation中的详细信息。
如果你在堆栈上分配太多,你会发现堆栈溢出!