strcpy 使程序崩溃
strcpy crashes the program
源代码:
priorityqueue_t * pqueue_create() {
priorityqueue_t *pq;
pq = (priorityqueue_t *) malloc(sizeof(priorityqueue_t));
pq->entries = (pqentry_t **) malloc(4 * sizeof(pqentry_t *));
pq->last = 0;
pq->size = 4;
return pq;
}
void pqueue_insert(priorityqueue_t *pq, char* value, float p) {
if (isFull(pq)) {
pq->size *= 2;
pq->entries = realloc(pq->entries, pq->size * sizeof(pqentry_t *));
}
pqentry_t *eintrag = malloc(sizeof(pqentry_t));
eintrag->pqvalue = (char *) malloc(sizeof(value));
eintrag->pqvalue = strcpy(eintrag->pqvalue,value);
//eintrag->pqvalue = value;
eintrag->priotity = p;
//hinten einfügen und einsortieren
pq->entries[pq->last] = eintrag;
pq->last += 1;
sortIn(pq,pq->last - 1);
}
static void sortIn (priorityqueue_t *pq, int pos) {
if (pos >= 1) {
for (int i = pos; i > 0; --i) {
if (pq->entries[i-1]->priotity > pq->entries[i]->priotity) {
pqentry_t *swap = pq->entries[i-1];
pq->entries[i-1] = pq->entries[i];
pq->entries[i] = swap;
}
}
}
}
主要代码:
char* randomString (int size) {
char* str = (char *) malloc((size+1)* sizeof(char));
for (int i = 0; i < size; ++i) {
str[i] = (rand() % 26) + 'A';
}
str[size] = '[=11=]';
return str;
}
int main() {
int i;
char* strings[MAX];
clock_t tic, toc;
srand(time(NULL));
for (i = 0; i < MAX; ++i) {
strings[i] = randomString(8);
}
priorityqueue_t *pq = pqueue_create();
tic = clock();
for (i = 0; i < MAX; i++){
pqueue_insert(pq,strings[i],rand() % 100);
}
toc = clock();
printf("insertion time: %.2f \n", (float) (toc-tic) / CLOCKS_PER_SEC);
tic = clock();
for (i = 0; i < MAX; i++){
pqueue_extractMin(pq);
}
toc = clock();
printf("extraction time: %.2f \n", (float) (toc-tic) / CLOCKS_PER_SEC);
for (i = 0; i < MAX; ++i) {
free(strings[i]);
}
pqueue_destroy(pq);
return 0;
}
我的问题是,当我尝试在 for 循环中第二次插入时,程序崩溃了。具有讽刺意味的是,当我手动或 运行 我笔记本电脑上的程序时,它会起作用。我很高兴得到所有帮助。
您在这一行中分配的 space 不足:
eintrag->pqvalue = (char *) malloc(sizeof(value));
那是因为 value
作为 char*
传递给 pqueue_insert
,所以 sizeof
运算符的编译时评估没有分配足够的 space 为你。尝试将分配更改为:
eintrag->pqvalue = malloc(1 + strlen(value));
请注意,C 规范定义了 char
的大小,即 1 个字节,因此此处不需要 sizeof(char)。
源代码:
priorityqueue_t * pqueue_create() {
priorityqueue_t *pq;
pq = (priorityqueue_t *) malloc(sizeof(priorityqueue_t));
pq->entries = (pqentry_t **) malloc(4 * sizeof(pqentry_t *));
pq->last = 0;
pq->size = 4;
return pq;
}
void pqueue_insert(priorityqueue_t *pq, char* value, float p) {
if (isFull(pq)) {
pq->size *= 2;
pq->entries = realloc(pq->entries, pq->size * sizeof(pqentry_t *));
}
pqentry_t *eintrag = malloc(sizeof(pqentry_t));
eintrag->pqvalue = (char *) malloc(sizeof(value));
eintrag->pqvalue = strcpy(eintrag->pqvalue,value);
//eintrag->pqvalue = value;
eintrag->priotity = p;
//hinten einfügen und einsortieren
pq->entries[pq->last] = eintrag;
pq->last += 1;
sortIn(pq,pq->last - 1);
}
static void sortIn (priorityqueue_t *pq, int pos) {
if (pos >= 1) {
for (int i = pos; i > 0; --i) {
if (pq->entries[i-1]->priotity > pq->entries[i]->priotity) {
pqentry_t *swap = pq->entries[i-1];
pq->entries[i-1] = pq->entries[i];
pq->entries[i] = swap;
}
}
}
}
主要代码:
char* randomString (int size) {
char* str = (char *) malloc((size+1)* sizeof(char));
for (int i = 0; i < size; ++i) {
str[i] = (rand() % 26) + 'A';
}
str[size] = '[=11=]';
return str;
}
int main() {
int i;
char* strings[MAX];
clock_t tic, toc;
srand(time(NULL));
for (i = 0; i < MAX; ++i) {
strings[i] = randomString(8);
}
priorityqueue_t *pq = pqueue_create();
tic = clock();
for (i = 0; i < MAX; i++){
pqueue_insert(pq,strings[i],rand() % 100);
}
toc = clock();
printf("insertion time: %.2f \n", (float) (toc-tic) / CLOCKS_PER_SEC);
tic = clock();
for (i = 0; i < MAX; i++){
pqueue_extractMin(pq);
}
toc = clock();
printf("extraction time: %.2f \n", (float) (toc-tic) / CLOCKS_PER_SEC);
for (i = 0; i < MAX; ++i) {
free(strings[i]);
}
pqueue_destroy(pq);
return 0;
}
我的问题是,当我尝试在 for 循环中第二次插入时,程序崩溃了。具有讽刺意味的是,当我手动或 运行 我笔记本电脑上的程序时,它会起作用。我很高兴得到所有帮助。
您在这一行中分配的 space 不足:
eintrag->pqvalue = (char *) malloc(sizeof(value));
那是因为 value
作为 char*
传递给 pqueue_insert
,所以 sizeof
运算符的编译时评估没有分配足够的 space 为你。尝试将分配更改为:
eintrag->pqvalue = malloc(1 + strlen(value));
请注意,C 规范定义了 char
的大小,即 1 个字节,因此此处不需要 sizeof(char)。