在SO问题[如何在C++中分配2D指针数组] [1],接受的答案还记录了如何解除分配和删除所述数组的正确过程,即"小心删除包含的指针,行数组和列数组都是以正确的顺序分开的." 所以,我已经成功地在细胞自动机模拟程序中使用这个2D阵列.但是,我不能让这个数组的内存管理正确.除了上面的参考文献之外,我没有看到如何做到这一点的答案.
我按如下方式分配2D数组:
Object*** matrix_0 = new Object**[rows];
for (int i = 0; i < rows; i++) {
matrix_0[i] = new Object*[cols];
}
Run Code Online (Sandbox Code Playgroud)
我徒劳地尝试(根据Valgrind)正确地取消分配上面的数组如下:
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
matrix_0[i][j] = NULL;
}
}
delete [] matrix_0;
matrix_0 = NULL;
Run Code Online (Sandbox Code Playgroud)
很明显,我错过了行和列部分作为参考[1]建议.你能告诉我我错过了什么吗?提前致谢.
[1] :( 2009年11月20日)如何在C++中分配2D指针数组
我修改了很多次这段代码的问题(但总是出现错误):似乎在释放"过滤器"的最后一个索引时出错
char** read_and_filter(int fd) {
char buf[MAXLENGTH];
char **bufs=NULL;
char ch;
int j = 0, len = 0, t = 0;
while (!t && read(fd,&ch,1) == 1) {
switch (ch) {
case '\n':
t = 1;
case ' ':
bufs = realloc(bufs, (j+1)*sizeof(char*));
bufs[j++] = strndup(buf,len);
memset(buf,0,len);
len = 0;
break;
default:
buf[len++] = ch;
}
}
bufs[j] = 0;
return bufs;
}
int main(int argc, char **argv) {
char **filter;
int i,fd = open("input.txt",O_RDONLY);
filter = read_and_filter(fd);
for(i = …Run Code Online (Sandbox Code Playgroud) 如何获得指向函数的指针u32?
我有一个函数,指向函数的指针:
fn getter_of_functions<T>(pointer: T) {
// ...
/*
This code don't compile ...
let fun_ptr: u32 = unsafe {
mem::transmute::<T, u32>(callback)
};
*/
}
fn function() {
println!("hello ...");
}
getter_of_functions(function);
Run Code Online (Sandbox Code Playgroud)
如何获得它(我必须有一个通用的功能)?我经常犯的错误是:
cannot transmute to or from a type that contains unsubstituted type parameters
Run Code Online (Sandbox Code Playgroud) 我目前有一个struct p,它包含另一个名为pg的结构的向量.这是进程结构:
struct p{
int i;
int s;
vector<pg*> pT;
void addP(struct pg* nP){
pT.push_back(nP);
}
Run Code Online (Sandbox Code Playgroud)
};
在程序的其他地方,我创建了一个新的p结构:
struct p *p1= (struct p*) malloc(sizeof(struct p));
Run Code Online (Sandbox Code Playgroud)
然后为id和size分配值.我想在struct的pT向量中添加一个新页面.所以我决定我可以做p1-> addP(makeP()),其中makePreturns指向pg结构的指针,pg*.
这是一个链接到gdb在segfaults时显示的内容.它还提到它正在push_back线上发生. http://imgur.com/KZOGnI9
指针有问题吗?或者我没有为矢量正确分配内存?
我有一个对象O1,它有指针.我通过复制构造函数创建了另一个对象O2.指针地址将被复制到对象O2中.当我离开O2的范围时,它将被删除.析构函数也将删除指针.这使得对象O1中的指针变得悬空.如何确保只有当我从O1出来时才删除指针.
在简短描述中,仅当没有其他人直接或间接引用该指针时,如何删除该对象指针.
class info {
public:
char *buf;
int len;
info(int l) {
len = l;
buf = new char[len];
buf[0] = 'h';
}
~info() {
delete[] buf;
}
};
int main() {
info O1(100);
cout << O1.buf << "\n";
{
info O2(O1);
}
cout << O1.buf << "\n";
}
Run Code Online (Sandbox Code Playgroud)
这里主要结尾处的O1的析构函数将获得一个SIGABT信号,用于尝试释放已经通过O2删除的O1.buf引用的内存.
我对编程非常陌生,正在尝试制定一个程序.但是,我没有得到任何有用的错误.该程序编译,但我在执行中途收到"分段错误"消息.在这个程序中,我要求输入一个月和一天,然后调用一个函数(我的计划是传递日期字符串,以及tempmonth数组的地址和tempday整数),将日期分为月份和一天,并将它们存储在地址中.然后在main中打印数据.我已经花了好几个小时来弄清楚我用指针和地址做错了什么......但我无法理解它.这是整个代码:
#include <stdio.h>
void separate(char*,char*,int*);
int main()
{
char date[12];
printf("Enter a month and a day: ");
fgets(date,12,stdin);
char tempmonth[10];
int tempday;
separate(date,&*tempmonth,&tempday);
printf("month is %s and day is %d",tempmonth,tempday);
return 0;
}
void separate(char*date,char*tempmonth, int*tempday)
{
sscanf(date,"%s %d",*tempmonth,*tempday);
}
Run Code Online (Sandbox Code Playgroud)
(由于某种原因,*不会按照char 日期和char tempmonth 打印- 它应该在那里.)提前谢谢你:)
我读了几个类似的问题,C:字符指针和数组之间的差异,是什么个char []与char*S之间的区别?,char array []和char*array有什么区别?但他们似乎都不清楚我的怀疑.
我知道
char *s = "Hello world";
Run Code Online (Sandbox Code Playgroud)
使字符串不可变,而
char s[] = "Hello world";
Run Code Online (Sandbox Code Playgroud)
可以修改.
我怀疑的是,如果我这样做char stringA[LEN]; ,char* stringB[LEN];他们有什么不同吗?或者stringB在之前的情况下再次变得不可变?
程序:
#include<stdio.h>
#include<string.h>
char *f_gets(char *s, int n, FILE *iop)
{
int c=0;
char *cs;
cs = s;
while (--n > 0 && (c = getc(iop)) != EOF)
{
if ((*cs++ = c) == '\n')
break;
}
*cs = '\0';
return (c == EOF && cs == s) ? NULL : s;
}
main(int argc, char *argv[])
{
FILE *fp1,*fp2;
char s2[100],s1[100];
if (argc <= 2 )
printf("2 argument needed \n");
else
if((fp1=fopen(argv[1],"r"))== NULL && (fp2=fopen(argv[2],"r"))==NULL)
printf("cat: can't open The …Run Code Online (Sandbox Code Playgroud) 前几天我正在玩指针,并提出以下代码,我明确地将int变量转换为int *并打印出明确转换变量的地址
#include <stdio.h>
int main (void)
{
int d;
int *p1, *p2;
printf("%p\n", p1 = &d);
printf("%p\n", p2 = (int *) d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
ffbff71c
ffbff878
Run Code Online (Sandbox Code Playgroud)
我的问题是第二个地址是什么,那里包含的内容是什么?
这段代码似乎对我不起作用.它输出的数字17显然是错误的.如果遇到5,15,25,50等数字,计数器应该会上升.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main(void) {
int i;
int counter;
char num[4322];
for (i = 1; i < sizeof(num); i++){
num[i] = i;
if ( strstr(&num[i], "5")){
counter = counter + 1;
}
}
printf("%d", counter);
return 0;
}
Run Code Online (Sandbox Code Playgroud)