我正在尝试创建一个一维标签数组,作为另一个2D数组中列中内容的引用。标签包含字母和数字。此外,我希望该方法具有通用性,使其能够尽可能广泛地使用各种标签。
下面是代码和输出。
main.m
#define IKOL 10
char *kolname [IKOL];
for (int i = 0; i < IKOL; i++) {
*(kolname + i) = " ";
}
sub *skuld =[[sub alloc]init];
[skuld set_name: kolname];
for (int i = 0; i < IKOL; i++) {
printf("Main: kolname[%d] = %s\n", i, *(kolname + i));
}实例方法:
sub.m
#define BUF 32
- (void)set_name: (char *[IKOL]) name {
int number = 30;
char label1[BUF];
char label2[BUF];
char label3[BUF];
char label4[BUF];
char test[12] = "Test2";
*(name + 0) = "Port1";
*(name + 1) = "Seq4";
*(name + 2) = "GH-12";
*(name + 3) = "Port5";
snprintf(label1, sizeof(label1), "DDB(%d)", number);
printf("Sub: label1 = %s\n", label1);
*(name + 4) = label1;
snprintf(label2, sizeof(label2), "σ(%d)", (number-16));
printf("Sub: label2 = %s\n", label2);
*(name + 5) = label2;
snprintf(label3, sizeof(label3), "EMM(%d)", (number-7));
printf("Sub: label3 = %s\n", label3);
*(name + 6) = label3;
*(name + 7) = "Test1";
*(name + 8) = test;
printf("Sub: test = %s\n", test);
}如果我们将BUF更改为8,我们将有以下输出
Sub: label1 = DDB(30)
Sub: label2 = σ(14)
Sub: label3 = EMM(23)
Sub: test = Test2
Main: kolname[0] = Port1
Main: kolname[1] = Seq4
Main: kolname[2] = GH-12
Main: kolname[3] = Port5
Main: kolname[4] = \360\276\277_\377
Main: kolname[5] = \360\277\277_\377
Main: kolname[6] =
Main: kolname[7] = Test1
Main: kolname[8] = Test2
Main: kolname[9] =
Program ended with exit code: 0对于所有的BUF来说,输出将是奇怪的,最多可达24。如果我们将BUF设置为25,我们就有了期望的输出:
Sub: label1 = DDB(30)
Sub: label2 = σ(14)
Sub: label3 = EMM(23)
Sub: test = Test2
Main: kolname[0] = Port1
Main: kolname[1] = Seq4
Main: kolname[2] = GH-12
Main: kolname[3] = Port5
Main: kolname[4] = DDB(30)
Main: kolname[5] = σ(14)
Main: kolname[6] = EMM(23)
Main: kolname[7] = Test1
Main: kolname[8] = Test2
Main: kolname[9] =
Program ended with exit code: 0 从BUF = 33的角度来看,所有的事情都是一样的,其中的主要区别是在槽8中缺少2号数字。
Sub: label1 = DDB(30)
Sub: label2 = σ(14)
Sub: label3 = EMM(23)
Sub: test = Test2
Main: kolname[0] = Port1
Main: kolname[1] = Seq4
Main: kolname[2] = GH-12
Main: kolname[3] = Port5
Main: kolname[4] = DDB(30)
Main: kolname[5] = σ(14)
Main: kolname[6] = EMM(23)
Main: kolname[7] = Test1
Main: kolname[8] = Test
Main: kolname[9] =
Program ended with exit code: 0 如果我们增加BUF,我们将看到更多奇怪的输出。下面是BUF = 50的一个示例。
Sub: label1 = DDB(30)
Sub: label2 = σ(14)
Sub: label3 = EMM(23)
Sub: test = Test2
Main: kolname[0] = Port1
Main: kolname[1] = Seq4
Main: kolname[2] = GH-12
Main: kolname[3] = Port5
Main: kolname[4] = DDB(30)
Main: kolname[5] = σ(14)
Main: kolname[6] =
Main: kolname[7] = Test1
Main: kolname[8] = \377
Main: kolname[9] =
Program ended with exit code: 0我的问题如下:
…最后
提前谢谢你!
发布于 2017-02-20 02:28:00
您的缓冲区label1、label2、label3、label4和test是在set_name中分配的。一旦set_name返回,这些缓冲区的生存期就结束了,并且(堆栈)内存可供重用。因此,一旦set_name返回,所观察到的任何结果基本上都是随机的。
如果您希望基于C字符串遵循相同的设计,则需要在set_name中使用缓冲区的动态/堆分配。这也意味着您将负责这些缓冲区的以后的去分配。
如果您使用的是Objective,您可能会考虑使用NSString,它将在ARC下自动管理内存。
https://stackoverflow.com/questions/42335436
复制相似问题