c - 递增指针位置

标签 c pointers increment

我有一个字符指针,用于 CSV 文件的文件名的一部分。我需要让它遵循以下模式:0、1、2、...、9、A、B、...、Y、Z、10、11、...等等。以下代码是处理该问题的程序的一部分,但当我尝试增加字符指针 FILE_num 中的一个“数字”时,出现段错误。我很确定现在的指针会增加指向下一个地址(该地址不存在)的指针。

我尝试了很多不起作用的方法(其中一半做了同样的事情,另一半则无法编译)。可能是其他原因导致了失败,但我相当确定就是这样。不幸的是,我必须使用 C,所以我不能使用字符串。

char * FILE_num ;

//
// from earlier in the program
//

FILE_num = (char *) malloc (sizeof (char)) ;
FILE_num = "0" ;

//
// skip several things that work but do not relate (maybe)
//

int lines = 0 ,
    digit     ;

//
// some code that counts lines in a file
//

if (lines > 0xfffff) { // if file is too large start new file
    for (digit = strlen (FILE_num) ; digit >= 0 ; digit --) {
        if (FILE_num [digit] == 'Z') { // add to proper digit
            FILE_num [digit] = '0' ;
                    }
        else if (FILE_num [digit] == '9') { // skip :;<=>?@
            FILE_num [digit] = 'A' ;
            break ;
        }
        else {
            FILE_num [digit] ++ ; // segmentation fault here
            break ;
        }
    }
    //
    // Some other code to handle overflow of digits
    //
}

最佳答案

您存在内存泄漏和未定义的行为。

FILE_num = "0" ;

导致内存泄漏 - 丢失动态分配的内存的地址。

“0”是一个包含字符 '0' 的数组和\0 。当您编写此语句时,该数组会衰减为指向数组第一个元素的指针,然后对其进行赋值。 FILE_num先前包含分配的内存的地址。现在你没有了(根据你给定的代码 - 如果你没有将地址存储在其他地方。)。所以你无法访问它。这就是内存泄漏的原因。

C 中的字符串文字是不可变的。你试图改变它。这是未定义的行为。

再说一遍,

FILE_num = (char *) malloc (sizeof (char)) ;

正在为 1 分配内存char 。您应该分配适当大小的内存。如果尺寸为1如果你想分配,那么你最好使用 char仅(此处情况并非如此)。

digit = strlen (FILE_num);...

在这里您正在访问\0首先 - 这是不需要的。您可以从 strlen( FILE_NUM )-1 循环过来至0

还有 malloc返回void*转换为char*隐式 - 您不需要强制转换它。

所以正确的方法是

FILE_num = malloc (sizeof (char) * LENGTH) ;

您需要检查malloc的返回值这样万一失败你就能处理这种情况。

if( NULL == FILE_num ){
    perror("malloc failed");
    exit(EXIT_FAILURE);
}

还有你跳过的想法skip :;<=>?@不太清楚。您可能需要正确地重新检查逻辑。

<小时/>
FILE_num = malloc(..)
char *store_for_later_use = FILE_num;
...

现在您可以更改FILE_num .

如果要初始化FILE_num"0" 内容相同的字符串使用strdup (如果缺少它(不是标准的一部分),您可以将其复制( "0" )到动态分配的内存中)。

FIL_num = strdup("0");

请注意,在使用完动态分配的内存后,请释放它。 (您还需要释放 strdup 返回的内存地址)。

关于c - 递增指针位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48345994/

相关文章:

c - 队列 - "dereferecing pointer to incomplete type"

C程序对两个连续数组元素的差进行升序排序

使用静态 vector 连续调用 R 函数 .C(),是否需要继续强制转换数据类型?

c++ - 将 vector<vector<int>> 指针传递给参数?

php - laravel 中的增量列

javascript - jQuery 递增和递减按钮将应用的值附加到数字

c - argv [1] [0]是什么意思?

c - 函数指针作为结构成员

arrays - slice 的别名

javascript - javascript类中的自动增量值