函数getFree()
我在一个类似问题的答案中看到了它,但字符串cpy
仍然具有第一次给出的相同字符串它运行的次数,即, T次。所以,有人请帮忙。
void getFree(char ** ptr) {
if (*ptr != NULL) {
free(*ptr);
}
return;
}
int main() {
int T, j;
scanf("%d", &T);
for (j = 0; j < T; j++) {
char * cpy,
int count = 0, i = 0, x = 0, k = 0;
cpy = (char*)malloc(500 * sizeof(char));
if (getchar() == '\n') {
do {
*(cpy + i) = getchar();
i++;
} while(*(cpy + i - 1) != '\n');
}
getFree(&cpy);
printf("%s", cpy);
}
return 0;
}
答案 0 :(得分:5)
Free使指针无效,但不会更改该值。如果那是你想要的,你应该把它归零。在释放它之后,它指向的内容是未定义的,但在它被重用之前可能包含最后一个内容。
free(*ptr);
*ptr = NULL;
答案 1 :(得分:0)
您可以考虑将#define GET_FREE_AT_BIS(Lin,PtrVar) do { \
void**ptr_##Lin = (void**) &(PtrVar); \
if (*ptr_##Lin) free (*ptr_##Lin); \
*ptr_##Lin = NULL; \
} while(0)
#define GET_FREE_AT(Lin,PtrVar) GET_FREE_AT_BIS(Lin,PtrVar)
#define GET_FREE(PtrVar) GET_FREE_AT(__LINE__,(PtrVar))
作为一个宏(作为Robert Jacobs' answer精神的替代方案),例如
__LINE__
需要双重间接才能使ptr_123
扩展并适合宏连接。它用于以某种方式使用ptr
等唯一的变量名进行第123行的宏调用(以便于调试,并且经常避免与名为GET_FREE(cpy);
的变量发生冲突)
然后代码
GET_FREE(ptrarr[i++]);
没有任何可见的运算符地址(在宏扩展中完成)。
我的宏即使作为#define GET_FREE_BUGGY(PtrVar) do { free(PtrVar); PtrVar=NULL; } while(0)
调用也应该工作,但是像
GET_FREE_BUGGY(ptrarr[i++]);
当p i
被调用时,不会像人们期望的那样工作,因为<?php
$con=mysqli_connect("localhost","root","","truck");
// Check connection
if (mysqli_connect_errno()){
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$sqlA="select date, truckno, bagscount from vendor";
$sqlB="select date, truckno, bagscount from truck";
$resultA=mysqli_query($con,$sqlA);
$resultB=mysqli_query($con,$sqlB);
$objA= mysqli_fetch_all($resultA,MYSQLI_NUM);
$objB= mysqli_fetch_all($resultB,MYSQLI_NUM);
$i=0;
$j=0;
while ($i<=(mysqli_num_rows($resultA)-1)){
if ($objA[$i][0]=$objB[$j][0] && $objA[$i][1]=$objB[$j][1] && $objA[$i][2]=$objB[$j][2]){
$i++;
echo "row ". $i. " matches". $j. "<hr>";
$j=0;
}
else
{
echo "not matched!";
$j++;
}
}
?>
会增加两倍。
答案 2 :(得分:0)
如果free
没有释放内存,正如您所建议的那样,对malloc
的后续调用必须返回不同的地址。请注意,参数未被更改,它只是在free
返回后访问它的未定义行为。
这只是因为free
实际上释放了内存,因此当您请求相同数量的内存时,对malloc
的后续调用可以(并且确实)返回相同的地址。
为什么不呢?这实际上是最佳行为。如果您只关心(重新)已分配内存的内容 - free
和malloc
都不会告诉您有关内容的信息。由于对内容没有任何保证或要求,他们决定不管它。
如果您希望将记忆清零,请改用calloc
或memset
或其他内容。否则只需放松并停止对未初始化记忆中的内容做出假设。
答案 3 :(得分:0)
对于您的特定情况,字符串无需在每次循环迭代中重新分配。考虑一下这个
#include <stdio.h>
#include <stdlib.h>
int main() {
char * cpy = malloc(500); // Allocate in the beginning
int T, i;
scanf("%d\n", &T); // Clear newline buffer
while (T--) {
// for (i = 0; (cpy[i] = getchar()) != '\n'; ++i); // Scan until newline
fgets(cpy, 499, stdin); // Scan until newline
printf("%s", cpy);
}
free(cpy); // Free in the end
return 0;
}
<强>输入强>
3
abcde
fghij
klmno
<强>输出强>
abcde
fghij
klmno