- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一个将字符串转换为字符串数组的函数。测试程序工作正常,直到我将 int main()
替换为 int main(int argc, char** argv)
控制台:
*** glibc detected *** ./a.out: realloc(): invalid pointer: 0xbfdc6370 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0xb764eee2]
/lib/i386-linux-gnu/libc.so.6(realloc+0x25d)[0xb765355d]
/lib/i386-linux-gnu/libc.so.6(realloc+0x273)[0xb7653573]
./a.out[0x80485d6]
./a.out[0x80486bf]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb75f24d3]
./a.out[0x8048461]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:05 2889457 /home/tg/a.out
08049000-0804a000 r--p 00000000 08:05 2889457 /home/tg/a.out
0804a000-0804b000 rw-p 00001000 08:05 2889457 /home/tg/a.out
085cc000-085ed000 rw-p 00000000 00:00 0 [heap]
b75a5000-b75c1000 r-xp 00000000 08:05 5637044 /lib/i386-linux-gnu/libgcc_s.so.1
b75c1000-b75c2000 r--p 0001b000 08:05 5637044 /lib/i386-linux-gnu/libgcc_s.so.1
b75c2000-b75c3000 rw-p 0001c000 08:05 5637044 /lib/i386-linux-gnu/libgcc_s.so.1
b75d8000-b75d9000 rw-p 00000000 00:00 0
b75d9000-b777c000 r-xp 00000000 08:05 5636109 /lib/i386-linux-gnu/libc-2.15.so
b777c000-b777d000 ---p 001a3000 08:05 5636109 /lib/i386-linux-gnu/libc-2.15.so
b777d000-b777f000 r--p 001a3000 08:05 5636109 /lib/i386-linux-gnu/libc-2.15.so
b777f000-b7780000 rw-p 001a5000 08:05 5636109 /lib/i386-linux-gnu/libc-2.15.so
b7780000-b7783000 rw-p 00000000 00:00 0
b7797000-b779a000 rw-p 00000000 00:00 0
b779a000-b779b000 r-xp 00000000 00:00 0 [vdso]
b779b000-b77bb000 r-xp 00000000 08:05 5636227 /lib/i386-linux-gnu/ld-2.15.so
b77bb000-b77bc000 r--p 0001f000 08:05 5636227 /lib/i386-linux-gnu/ld-2.15.so
b77bc000-b77bd000 rw-p 00020000 08:05 5636227 /lib/i386-linux-gnu/ld-2.15.so
bfda7000-bfdc8000 rw-p 00000000 00:00 0 [stack]
Aborted (core dumped)
代码:
/* tokenize function*/
int tokenize(char ***tokenList, char *string, char *separators){
/* initialization */
int count = 0; // token counter
int length = strlen(string) + 1; // length of string array
int lengthSep = strlen(separators); // number of separators
char *memory = malloc(length); // copy of string; string token array in the end
if (memory == NULL) // error treatment for malloc
return -1;
memcpy(memory, string, length);
char *lastPos = memory; // start position of the current string token in memory
char **tempList; // temporary pointer to token array
/* find occurences of separators and replace them with '\0', reallocate tempList for each new string token built in that way */
for (int i = 0; i < length; i++){
/* check if current character is a separator */
for (int j = 0; j <= lengthSep; j++){
if (*(memory + i) == separators[j]){
count++; // increase string counter
*(memory + i) = '\0'; // replace separator by '\0'
tempList = realloc(tempList, sizeof(char*) * count); // reallocate tempList
if (tempList == NULL){ // error treatment for realloc
free(memory);
free(tempList);
return -1;
}
tempList[count-1] = lastPos; // add pointer to the new string to the end of tempList
lastPos = memory + i + 1; // calculate starting position for the next string token
break; // escape from inner loop (found matching separator)
}
}
}
*tokenList = tempList;
return count;
}
int main(){
char string[100] = "aa/bbb/cccc";
char separators[2] = "/";
char **tokenList;
int count;
count = tokenize(&tokenList,string, separators);
printf("count: %d\n", count);
printf("item: %s\n", tokenList[0]);
return EXIT_SUCCESS;
}
最佳答案
您没有初始化 tempList
,因此您第一次调用 tempList = realloc(tempList,...
时,您正在尝试扩展/释放任意地址。
最简单的修复方法就是将 tempList
初始化为 NULL
char **tempList = NULL;
顺便说一句,代码
tempList = realloc(tempList, sizeof(char*) * count);
if (tempList == NULL){
free(memory);
free(tempList);
return -1;
}
包含另一个小错误。如果 realloc
失败并且 tempList
为 NULL
,则您已经泄露了 tempList
的先前值并调用了 free(tempList)
什么都不做。如果你想正确处理内存不足的错误,你需要做类似的事情
void* tmp = realloc(tempList, sizeof(char*) * count);
if (tmp == NULL){
free(memory);
free(tempList);
return -1;
}
tempList = tmp;
关于如果我将 argc/argv 放入主函数而不使用它们,c 程序将失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13975142/
目前我正在学习 C 并试图理解这些说明。它们真的不同吗? ++*argv *argv++ *(++argv) *(argv++) 谢谢! 最佳答案 后缀递增运算符的优先级高于指针取消引用运算符,而不是
我正在与在 Hostgator 共享主机上运行的 PHP CLI 的一个(也许)简单问题作斗争。一个简单的代码: 在我的本地机器上运行时以及其他几个 php 实例: php test.php arg
谁能解释一下原因 int main(int argc, const char * argv[]) { while (* argv) puts(* argv++); return 0 ;
从 K&R 的 C 书的第 5.10 章开始,argv 的概念被引入以允许命令行参数。 argv 是指向字符指针数组的指针。据此,以下代码如何检查提供的参数是否以连字符开头? (*++argv)[0]
我不明白 sys.argv 和 argv 之间的区别,网上没有任何东西给我我理解的概念。如果两者相同!我们什么时候使用 sys.argv 什么时候使用 argv ? 如果不是,sys.argv 是什么
我正在编写一个接受参数的 C 程序,char *argv[] 来决定运行哪个 exec()。我有 execlp(argv[1], argv[1], NULL) 可以正常工作。出于某种原因,execvp
char** argv 和 char* argv[] 有什么区别?在 int main(int argc, char** argv) 和 int main(int argc, char* argv[]
我目前有一个 python 脚本,可以在大型网络中完成一项非常有用的任务。我所做的是使用 lsof -iTCP -F 和其他一些选项来转储所有监听的 TCP 套接字。我能够得到 argv[0],这不是
为什么 argvs 的行为很奇怪?示例: 这将按预期工作,打印第一个参数的第一个字符。 printf("%c", *argv[1]); 但是,这将打印 ascii 表中的字符(又名“更大”,表示为数字
我做了一个小的重复异或加密器。您可以使用您选择的键对您选择的字符串进行异或运算,它可以选择将其输出到文件中。 无论何时使用单个单词(无空格)字符串和键运行程序,都没有问题。但是,只要字符串或键中有空格
我刚开始学习 C,想知道我应该在我的主要方法中使用其中的哪一个。有什么不同吗?哪个更常见? 最佳答案 由于您刚开始学习 C,我建议您首先真正尝试了解数组和指针之间的区别,而不是共同的东西。 在参数和数
所以我在编译器转换的函数中传递数组时在幕后阅读过 int myArray(int arr[]) 进入 int myArray(int *arr) 例如,大多数时候数组也会衰减为指针 arr[0] 与相
我正在编写一个小的 shell 程序,它接受一个命令并执行它。如果用户输入无效命令,则 if 语句返回 -1。如果命令正确,它就会执行命令,但是一旦它执行了命令,程序就会结束。我做错了什么是不执行它之
是否可以传入自定义参数列表? 与现实生活中的用例相比,更多是出于好奇,但例如,我可能希望在让 argparse 完成其工作之前将所有参数转换为小写。 最佳答案 Yes .只需传入要parse_args
我知道这个问题很基础,我也是新手,所以请帮我解决这个问题: 我有这个代码: int wmain(int argc, wchar_t *argv[]) { if (*argv[1] == L'-
这个问题在这里已经有了答案: Understanding slicing (38 个答案) 关闭 3 个月前。 我写了这段代码: #!/usr/bin/env python import sys i
我的程序获取主要参数,我的任务是检查用户是否在执行文件和参数之间输入了空格。 这是一个没有在 argv[0] 为 HW01 和 argv[1] 之间输入空格的人的例子/n: HW01/n 但是如果有人
我的 c 技能很生疏,所以如果这是一个愚蠢的问题,我深表歉意,但我什至没想过要寻找这个简单问题的答案。此代码编译时没有任何警告: #include int run_script( int argc,
这个问题在这里已经有了答案: Should I use char** argv or char* argv[]? (10 个答案) What does the 'array name' mean i
我有以下代码片段: int main(int argc, char *argv[]) { char line[MAXLINE]; long lineno = 0; i
我是一名优秀的程序员,十分优秀!