Closed. This question is
off-topic。它当前不接受答案。
想改善这个问题吗?
Update the question,所以它是
on-topic,用于堆栈溢出。
5年前关闭。
该代码适用于小尺寸
words
,但对于长尺寸
Segmentation fault
给出
words
错误。例如,长度为438的
words
可以正常工作;但是,长度为12500的
words
不起作用,会出现错误。
代码:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <malloc.h>
const long long max_size = 2000; // max length of strings
const long long N = 40; // number of closest words that will be shown
const long long max_w = 50; // max length of vocabulary entries
int main(int argc, char **argv) {
FILE *f;
char st1[max_size];
char kelimeler[max_size];
char *kelimelerim[max_size];
char *bestw[N];
char file_name[max_size], st[100][max_size];
float dist, len, bestd[N], vec[max_size];
long long words, size, a, b, c, d, cn, bi[100];
char ch;
float *M;
char *vocab;
strcpy(file_name, argv[1]);
f = fopen(file_name, "rb");
fscanf(f, "%lld", &words);
fscanf(f, "%lld", &size);
vocab = (char *)malloc((long long)words * max_w * sizeof(char));
for (a = 0; a < N; a++) bestw[a] = (char *)malloc(max_size * sizeof(char));
M = (float *)malloc((long long)words * (long long)size * sizeof(float));
printf("control 1\n");
for (b = 0; b < words; b++) {
a = 0;
int sayac=0;
while (1) {
sayac++;
vocab[b * max_w + a] = fgetc(f);
if (feof(f) || (vocab[b * max_w + a] == ' ')) {
strcpy(kelimeler,&vocab[b * max_w + a-sayac+2]);
kelimelerim[b] = strdup(kelimeler);
sayac=0;
break;
}
if ((a < max_w) && (vocab[b * max_w + a] != '\n'))
a++;
}
vocab[b * max_w + a] = 0;
for (a = 0; a < size; a++)
fread(&M[a + b * size], sizeof(float), 1, f);
len = 0;
for (a = 0; a < size; a++)
len += M[a + b * size] * M[a + b * size];
len = sqrt(len);
for (a = 0; a < size; a++)
M[a + b * size] /= len;
}
fclose(f);
printf("control 2\n");
FILE *ptr_file;
ptr_file =fopen("output.txt", "w");
if (!ptr_file)
return 1;
printf("control 3\n");
long long int indeks;
printf("control 4\n");
for (indeks = 0; indeks < words; indeks++){
printf("control 4.1\n");
for (a = 0; a < N; a++) bestd[a] = 0;
printf("control 4.2\n");
for (a = 0; a < N; a++) bestw[a][0] = 0;
printf("control 4.3\n");
fprintf(ptr_file,"\n---\n");
printf("control 4.4\n");
fprintf(ptr_file,"%s %lld\n",kelimelerim[indeks],indeks); //The line gives ERROR
printf("control 4.5\n");
printf("%s %lld \n",kelimelerim[indeks], indeks);
终端输出:
control 1
control 2
control 3
control 4
control 4.1
control 4.2
control 4.3
control 4.4
./demo-word.sh: line 7: 5829 Segmentation fault (core dumped) ./distance vectors.bin
问题是这一行:
strcpy(kelimeler, &vocab[b * max_w + a-sayac+2]);
由于
vocab[]
永远不会被nul终止(您稍后再做,但是到那时为止为时已晚)。这意味着
kelimeler[]
很容易溢出,并且您进入未定义的行为区域。
在尝试复制字符串之前,只需要对字符串进行n终止处理即可:
vocab[b * max_w + a] = '\0'; //+1 if you like to keep the space
strcpy(kelimeler, &vocab[b * max_w + a-sayac+2]);
我是一名优秀的程序员,十分优秀!