【发布时间】:2016-03-10 11:31:10
【问题描述】:
char** names=(char**)malloc(count*sizeof(char*));
//while loop
names[count]=(char*)malloc(size+1);//why malloc again?
所以char** names=(char**)malloc(count*sizeof(char*)); 创建一个指向托管4 times count 字节的位置的指针,然后将指针位置存储到名称?
然后在while循环中,分配size+1字节长内存,并将其地址赋予names[count],是指names指向的位置?那么这里从第一个malloc创建的内存存储了第二个malloc创建的内存位置?并且内存指针的大小是 4 字节,以便我可以通过从内存位置开始移动到接下来的 4 个字节来访问每个 names[count]?
如果我的想法是正确的,这两行 c 代码的这些 NASM 实现是否正确:
;char** names=(char**)malloc(count*sizeof(char*));
mov eax, dword count
;lea ebx, [eax*4]
imul ebx, eax, 4
push ebx
call _malloc
mov names, eax
add esp, 4
;names[count]=(char*)malloc(size+1);
mov ebx, size
inc ebx
push ebx
call _malloc
add esp,4
mov ebx, names
mov ecx, dword count
mov [ebx+ecx*4], eax
同样,这两行代码是以下 c 代码的一部分,用于从文件中提取名称并对其进行排序:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char path[]="names.txt";
char szName[50];
int count=0;
int size=0;
int x=0;
int y=0;
char* temp=0;
int pos=0;
FILE* file=fopen(path,"rt");
if (file){
while (!feof(file)){
fscanf(file,"%50s",szName);
count++;
}
}
else{
printf("Error opening file\n");
return 1;
}
printf ("Count: %d\n",count);
char** names=(char**)malloc(count*sizeof(char*));
rewind(file);
count=0;
while (!feof(file)){
fscanf(file,"%50s",szName);
size=strlen(szName);
names[count]=(char*)malloc(size+1);
strcpy(names[count],szName);
count++;
}
printf("Original file\n");
for (x=0;x<count;x++){
printf("Name %d:\t%s\n",x+1,names[x]);
}
for (x=0;x<count;x++){
temp=names[x];
pos=x;
for (y=x;y<count;y++){
if (strcmp(temp,names[y])>0){
temp=names[y];
pos=y;
}
}
temp=names[x];
names[x]=names[pos];
names[pos]=temp;
}
printf("Sorted names\n");
for (x=0;x<count;x++){
printf("Name %d:\t%s\n",x+1,names[x]);
}
system("PAUSE");
return 0;
}
【问题讨论】:
-
不要做
names[count]=(char*)malloc(size+1);。这是越界访问。 -
这是我的导师给出的工作代码的一部分。我会将代码发布在操作中。
-
工作?它似乎发生起作用了。它被认为是危险的,所以不要执行代码!
-
您的讲师正在教您编写糟糕的代码。想要一个具有两个间接级别的动态数组?
char (*array)[y] = malloc(x * sizeof *array);... 想要三层间接?char (*array)[y][z] = malloc(x * sizeof *array);... 如您所见,不需要多个mallocs 来产生一个数组,实际上使用多个mallocs 是错误的。 数组是一个连续的内存块,在单个分配中,大多数函数都依赖于此。 使用多个mallocs 会严重破坏很多标准函数。 -
好吧我不会用,不过还是请大家帮我理解一下背后的逻辑吧。
标签: c arrays pointers malloc nasm