我有一个字符指针,用于 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/