- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做一本书的练习,将句子中的单词改成 pig latin。代码在window 7下运行正常,但是当我在mac上编译时,错误就出来了。
经过一些测试,错误来自那里。我不明白这个问题的原因。我为所有指针使用动态内存,并且还添加了空指针检查。
while (walker != NULL && *walker != NULL){
free(**walker);
free(*walker);
free(walker);
walker++;
}
完整源代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define inputSize 81
void getSentence(char sentence [], int size);
int countWord(char sentence[]);
char ***parseSentence(char sentence[], int *count);
char *translate(char *world);
char *translateSentence(char ***words, int count);
int main(void){
/* Local definition*/
char sentence[inputSize];
int wordsCnt;
char ***head;
char *result;
getSentence(sentence, inputSize);
head = parseSentence(sentence, &wordsCnt);
result = translateSentence(head, wordsCnt);
printf("\nFinish the translation: \n");
printf("%s", result);
return 0;
}
void getSentence(char sentence [81], int size){
char *input = (char *)malloc(size);
int length;
printf("Input the sentence to big latin : ");
fflush(stdout);
fgets(input, size, stdin);
// do not copy the return character at inedx of length - 1
// add back delimater
length = strlen(input);
strncpy(sentence, input, length-1);
sentence[length-1]='\0';
free(input);
}
int countWord(char sentence[]){
int count=0;
/*Copy string for counting */
int length = strlen(sentence);
char *temp = (char *)malloc(length+1);
strcpy(temp, sentence);
/* Counting */
char *pToken = strtok(temp, " ");
char *last = NULL;
assert(pToken == temp);
while (pToken){
count++;
pToken = strtok(NULL, " ");
}
free(temp);
return count;
}
char ***parseSentence(char sentence[], int *count){
// parse the sentence into string tokens
// save string tokens as a array
// and assign the first one element to the head
char *pToken;
char ***words;
char *pW;
int noWords = countWord(sentence);
*count = noWords;
/* Initiaze array */
int i;
words = (char ***)calloc(noWords+1, sizeof(char **));
for (i = 0; i< noWords; i++){
words[i] = (char **)malloc(sizeof(char *));
}
/* Parse string */
// first element
pToken = strtok(sentence, " ");
if (pToken){
pW = (char *)malloc(strlen(pToken)+1);
strcpy(pW, pToken);
**words = pW;
/***words = pToken;*/
// other elements
for (i=1; i<noWords; i++){
pToken = strtok(NULL, " ");
pW = (char *)malloc(strlen(pToken)+1);
strcpy(pW, pToken);
**(words + i) = pW;
/***(words + i) = pToken;*/
}
}
/* Loop control */
words[noWords] = NULL;
return words;
}
/* Translate a world into big latin */
char *translate(char *word){
int length = strlen(word);
char *bigLatin = (char *)malloc(length+3);
/* translate the word into pig latin */
static char *vowel = "AEIOUaeiou";
char *matchLetter;
matchLetter = strchr(vowel, *word);
// consonant
if (matchLetter == NULL){
// copy the letter except the head
// length = lenght of string without delimiter
// cat the head and add ay
// this will copy the delimater,
strncpy(bigLatin, word+1, length);
strncat(bigLatin, word, 1);
strcat(bigLatin, "ay");
}
// vowel
else {
// just append "ay"
strcpy(bigLatin, word);
strcat(bigLatin, "ay");
}
return bigLatin;
}
char *translateSentence(char ***words, int count){
char *bigLatinSentence;
int length = 0;
char *bigLatinWord;
/* calculate the sum of the length of the words */
char ***walker = words;
while (*walker){
length += strlen(**walker);
walker++;
}
/* allocate space for return string */
// one space between 2 words
// numbers of space required =
// length of words
// + (no. of words * of a spaces (1) -1 )
// + delimater
// + (no. of words * ay (2) )
int lengthOfResult = length + count + (count * 2);
bigLatinSentence = (char *)malloc(lengthOfResult);
// trick to initialize the first memory
strcpy(bigLatinSentence, "");
/* Translate each word */
int i;
char *w;
for (i=0; i<count; i++){
w = translate(**(words + i));
strcat(bigLatinSentence, w);
strcat(bigLatinSentence, " ");
assert(w != **(words + i));
free(w);
}
/* free memory of big latin words */
walker = words;
while (walker != NULL && *walker != NULL){
free(**walker);
free(*walker);
free(walker);
walker++;
}
return bigLatinSentence;
}
最佳答案
你的代码不必要地复杂,因为你已经设置了这样的东西:
n
: 字数words
: 指向可以容纳 n+1
的已分配内存char **
按顺序值words[i]
( 0 <= i && i < n
): 指向可以容纳一个 char *
的已分配内存按顺序words[n]
: NULL
words[i][0]
: 指向为单词分配的内存(和以前一样,0 <= i < n)因为每个words[i]
指向顺序的东西,有一个words[i][j]
对于一些有效的整数 j ... 但是 j
的允许值始终为 0,因为只有一个 char *
malloc() 在那里。所以你可以完全消除这种间接级别,只需要 char **words
.
但这不是问题所在。释放循环以 walker
开始与 words
相同, 所以它首先尝试释放 words[0][0]
(这很好并且有效),然后尝试释放 words[0]
(这很好并且有效),然后尝试释放 words
(这很好并且有效,但意味着您不能再访问任何其他 words[i]
以获得 i
的任何值——即“存储泄漏”)。然后它增加 walker
, 使其或多或少等同于 &words[1]
;但是words
已经free()
d.
而不是使用 walker
在这里,我将使用带有一些整数的循环 i
:
for (i = 0; words[i] != NULL; i++) {
free(words[i][0]);
free(words[i]);
}
free(words);
我还建议删除所有 malloc()
上的强制转换和 calloc()
返回值。如果您在执行此操作后收到编译器警告,它们通常意味着以下两种情况之一:
#include <stdlib.h>
, 或后者有时有效,但却是痛苦的根源:好的 C 代码是坏的 C++ 代码,好的 C++ 代码不是 C 代码。 :-)
编辑:PS:我错过了差一 lengthOfResult
@David RF 捕获了。
关于c - "Pointer being freed was not allocated"发生在 mac 但不是在 windows 7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17891538/
我正在使用套接字并将一些数据写入服务器。第一次连接到服务器时一切正常。但是当它第二次写入,有时是第三次写入时,它会因错误而崩溃: "malloc: *** error for object 0x7c1
给定代码: class Sample { public: int *ptr; Sample(int i) { ptr = new int(i);
#include #include #include #include #include using namespace std; class CFile { public: CFi
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。为了帮助澄清这个问题以便可以重新打开它,visit the help center
我正在尝试在线找到的四叉树实现,但作为以下(精简的)_node_release 函数的一部分,间歇性地收到“正在释放的指针未分配”错误: static void _node_release(node*
我正在尝试在线找到的四叉树实现,但作为以下(精简的)_node_release 函数的一部分,间歇性地收到“正在释放的指针未分配”错误: static void _node_release(node*
我正在尝试运行一个删除链表第 n 个元素的函数(使用从零开始的索引)。即使我不必 malloc 任何东西,我也会收到此错误:“ev(10676,0x7fff73f9d300) malloc: * er
我正在从标准输入读取内容。由于我不知道要读的内容的长度,所以我必须使用 malloc。 我得到一个被释放的指针未分配 有时,它发生在 free(final) 之前,有时发生在 free(tmp) 之前
我得到一个错误 malloc: *** error for object 0x146f9404: incorrect checksum for freed object - object was
我正在使用 C++ 进行线程处理并进行了一些测试并遇到了这个错误。 这是我的代码: #include #include #include #include #include using na
我有以下功能: void stringcopy(char * to, char const * const from) { int size = 1; while (from[size
每次我想将元素添加到存储类中的 std::map 时,我都会收到错误消息“未分配正在释放的指针”。我在构造函数和析构函数中添加了一些“couts”来调试,输出是: 新的德尔删除 所以看起来析构函数被调
我定义了一个包含字节数组及其长度的结构。析构函数应该只删除字节数组,如果它是由结构的构造函数动态实例化的话。但有时,delete array; 指令失败并出现错误 pointer being free
我正在构建一个 AVL 树。我有一种方法可以删除树中的项目,但出现错误。 这是我得到的运行时错误: malloc: *** error for object 0x100100120: pointer
这是我的功能: void Tetris::place_square(int* coords,char type){ if (coords[1]>heights[coords[0]]){
我创建了一个双链表类,并试图将它与我创建的 Vector 类一起使用,以便制作一个链表 vector ,但是在程序结束时,我似乎遇到了一个错误malloc:对象 0x100100be0 的 *** 错
我想我的 C 现在有点生疏了,因为我不太明白这里的问题。我很确定它位于 parse_historical_data() 中。如果我将其注释掉并运行 allocate_historical_data()
我正在使用 C 语言研究 Segdwick 的算法,并尝试动态链表数组。我在 main 的 return 0 处遇到段错误。我的重点是正确加载和打印链接列表,完成后我没有释放列表数组。 所以我添加了
我正在努力寻找无法释放内存块的原因。指针一定有问题。结构的内存块在函数中创建,使用的指针存储在数组中。稍后从数组中获取指针以用于释放内存。 我已经弄清楚它是免费的了。我在它旁边放了“//这个”。 #i
我正在尝试重载赋值运算符以执行多边形对象的深拷贝,程序编译但我在接近尾声时收到错误,我想清除。以下是相关代码,如果您认为我需要添加更多内容,请发表评论。假设适当的 #include的那 class P
我是一名优秀的程序员,十分优秀!