【发布时间】:2017-01-24 21:27:40
【问题描述】:
C 程序是一个 Damereau-Levenshtein 算法,它使用一个矩阵来比较两个字符串。在main() 的第四行,我想malloc() 矩阵(二维数组)的内存。在测试中,我 malloc'd (0) 并且它仍然运行良好。似乎无论我输入malloc(),该程序仍然有效。这是为什么呢?
我在 Visual Studio 开发人员命令提示符下使用“cl”命令编译了代码,没有出现错误。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
int main(){
char y[] = "felkjfdsalkjfdsalkjfdsa;lkj";
char x[] = "lknewvds;lklkjgdsalk";
int xl = strlen(x);
int yl = strlen(y);
int** t = malloc(0);
int *data = t + yl + 1; //to fill the new arrays with pointers to arrays
for(int i=0;i<yl+1;i++){
t[i] = data + i * (xl+1); //fills array with pointer
}
for(int i=0;i<yl+1;i++){
for(int j=0;j<xl+1;j++){
t[i][j] = 0; //nulls the whole array
}
}
printf("%s", "\nDistance: ");
printf("%i", distance(y, x, t, xl, yl));
for(int i=0; i<yl+1;i++){
for(int j=0;j<xl+1;j++){
if(j==0){
printf("\n");
printf("%s", "| ");
}
printf("%i", t[i][j]);
printf("%s", " | ");
}
}
}
int distance(char* y, char* x, int** t, int xl, int yl){
int isSub;
for(int i=1; i<yl+1;i++){
t[i][0] = i;
}
for(int j=1; j<xl+1;j++){
t[0][j] = j;
}
for(int i=1; i<yl+1;i++){
for(int j=1; j<xl+1;j++){
if(*(y+(i-1)) == *(x+(j-1))){
isSub = 0;
}
else{
isSub = 1;
}
t[i][j] = minimum(t[i-1][j]+1, t[i][j-1]+1, t[i-1][j-1]+isSub); //kooks left, above, and diagonal topleft for minimum
if((*(y+(i-1)) == *(x+(i-2))) && (*(y+(i-2)) == *(x+(i-1)))){ //looks at neighbor characters, if equal
t[i][j] = minimum(t[i][j], t[i-2][j-2]+1, 9999999); //since minimum needs 3 args, i include a large number
}
}
}
return t[yl][xl];
}
int minimum(int a, int b, int c){
if(a < b){
if(a < c){
return a;
}
if(c < a){
return c;
}
return a;
}
if(b < a){
if(b < c){
return b;
}
if(c < b){
return c;
}
return b;
}
if(a==b){
if(a < c){
return a;
}
if(c < a){
return c;
}
}
}
【问题讨论】:
-
C 根本没有边界检查。甚至对于数组(编译器实际上具有大小)也不行。越界会导致未定义的行为。
-
您可能会调用未定义的行为。您可以溢出在 C 中提供给您的缓冲区 - 这并不意味着这样做是个好主意。您可以确保分配足够的内存,永远不要超出其界限,以及释放它。
-
“它有效” - 你这么认为。你的程序肯定调用了未定义的行为;结果你观察到的任何东西,并试图将任何形式的“感觉”固定在上面,都是一种天真的努力。说实话,实际上它不幸从你的角度看来是“工作”。如果它坠毁并燃烧,冒烟的残骸将是一个有形的迹象,表明出现了问题。总比让你误以为是正确的感觉要好得多。
标签: c windows malloc dynamic-memory-allocation