0

我有一个小程序,可以将 12 小时时间转换为 24 小时时间。

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>

int get_tokens(char* buf, char *fields[], char *sep){

    char* ptr= (char*)malloc((10*sizeof(char))+1);
        strncpy(ptr, buf, 10);
        *(ptr+10)='\0';
    int num_f=0;

    while((fields[num_f] = strtok(ptr,sep)) != NULL ){
        ptr = NULL;
        num_f++;
    }
    return num_f;
}


char* timeConversion(char* s) {
    char *fields[3];
    int num_f=0;
    char *ptr = (char*) malloc(100*sizeof(char));
    int hour=0;

    get_tokens(s, fields, ":");
    if(strstr(s,"PM")){
        hour=atoi(fields[0])+12;
    }
    else{
      hour=atoi(fields[0]);
    } 

    snprintf(ptr, 9, "%d:%s:%s" ,hour,fields[1],fields[2]);
    return ptr;
}

int main() {
    char* s = (char *)malloc(100 * sizeof(char));
    scanf("%s", s);
    char* result = timeConversion(s);
    printf("%s\n", result);
    return 0;
}

在 timeConversion 函数返回后,我立即看到“堆栈粉碎”。我知道代码的逻辑有效,但无法弄清楚堆栈粉碎。

4

1 回答 1

0

函数get_tokens使用 3 个指针写入堆栈分配的缓冲区,而不检查缓冲区容量限制。fields[num_f] = strtok可能会导致堆栈缓冲区溢出。同时fields项目可以在未初始化的情况下使用。

free由于您从未分配过内存,因此还存在内存泄漏。

于 2018-03-18T10:55:09.323 回答